4

举个例子。

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"

也就是说,最后的列以三组为一组,总是按顺序排列 X1X2, X3+ 应用的函数。

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

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

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

4

3 回答 3

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
于 2015-06-30T05:10:05.277 回答
2

使用 baseR你可以试试这个:

> 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
于 2015-06-30T05:20:16.037 回答
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))
于 2015-06-30T05:44:37.640 回答