采用以下示例。
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"
也就是说,最终列以三个为一组,始终排序X1
,X2
,X3
+应用的函数。
但是,我希望它看起来像这样
[1] "X1" "X1_mean" "X1_median" "X2" "X2_mean" "X2_median" "X3" "X3_mean" "X3_median"
有没有人知道如何实现这一点,最好使用dplyr
来实现具有许多列和任意列名的数据框?
答案 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))