对“规范”中的列重新排序'在mutate_each或summarise_each之后的方式

时间:2015-06-30 04:52:07

标签: r dplyr columnname

采用以下示例。

library(dplyr)
temp <- data.frame(lapply(1:3, function(i) rnorm(5, 0, 1)))
names(temp) <- paste0("X", 1:3)

temp_each <-
    temp %>%
    mutate_each(funs(mean, median))

检查temp_each的名称,我们看到了

> names(temp_each)
[1] "X1"        "X2"        "X3"        "X1_mean"   "X2_mean"   "X3_mean"   "X1_median" "X2_median" "X3_median"

也就是说,最终列以三个为一组,始终排序X1X2X3 +应用的函数。

但是,我希望它看起来像这样

[1] "X1"        "X1_mean"   "X1_median" "X2"        "X2_mean"   "X2_median" "X3"        "X3_mean"   "X3_median"

有没有人知道如何实现这一点,最好使用dplyr来实现具有许多列和任意列名的数据框?

3 个答案:

答案 0 :(得分:5)

您可以在mixedorder

使用gtools
library(gtools)
temp_each[,mixedorder(colnames(temp_each))]

#           X1    X1_mean  X1_median         X2    X2_mean  X2_median
#1  0.28285115 -0.4369067 0.08556155 -0.9402162 -0.9857593 -0.7676634
#2 -1.29193398 -0.4369067 0.08556155 -0.5442052 -0.9857593 -0.7676634
#3 -1.42261044 -0.4369067 0.08556155 -0.7676634 -0.9857593 -0.7676634
#4  0.16159810 -0.4369067 0.08556155 -2.2270920 -0.9857593 -0.7676634
#5  0.08556155 -0.4369067 0.08556155 -0.4496198 -0.9857593 -0.7676634
#           X3   X3_mean   X3_median
#1  0.04606554 0.0923336 -0.08168136
#2 -0.08168136 0.0923336 -0.08168136
#3  0.90535333 0.0923336 -0.08168136
#4 -0.15699052 0.0923336 -0.08168136
#5 -0.25107897 0.0923336 -0.08168136

答案 1 :(得分:2)

使用基座R,你可以试试这个:

> temp_each[order(colnames(temp_each))]
#          X1    X1_mean X1_median         X2   X2_mean  X2_median         X3  X3_mean X3_median
#    1  0.4142743 -0.4389318 -0.285517  1.8662158 0.3534017 -0.2308971  1.3593561 0.478106 0.6306579
#    2 -0.8031115 -0.4389318 -0.285517 -0.2308971 0.3534017 -0.2308971 -0.6160166 0.478106 0.6306579
#    3 -1.8729143 -0.4389318 -0.285517  1.0171626 0.3534017 -0.2308971  0.2634524 0.478106 0.6306579
#    4  0.3526097 -0.4389318 -0.285517 -0.6378480 0.3534017 -0.2308971  0.6306579 0.478106 0.6306579
#    5 -0.2855170 -0.4389318 -0.285517 -0.2476247 0.3534017 -0.2308971  0.7530800 0.478106 0.6306579

答案 2 :(得分:1)

感谢大家使用基础R或其他方式获得答案。

这是我首选的基础R解决方案。

old_names <- names(temp)
new_names <- unlist(lapply(old_names, function(old_name) paste0(old_name, c("_mean", "_median"))))
temp_each <- temp_each[new_names]

但是,我现在已经使用标准评估在dplyr中找到了如何做到这一点,从这个答案:Group by multiple columns in dplyr, using string vector input

相当令人费解。

temp <- data.frame(lapply(1:3, function(i) rnorm(5, 0, 1)))
names(temp) <- paste0("X", 1:3)

old_names <- names(temp)
new_names <- unlist(lapply(old_names, function(old_name) paste0(old_name, c("_mean", "_median"))))


temp_each <-
    temp %>%
    mutate_each(funs(mean, median)) %>%
    select_(.dots = lapply(new_names, as.symbol))