【发布时间】:2016-03-08 03:12:15
【问题描述】:
我正在使用下面的代码来生成一个简单的汇总表:
# Data
data("mtcars")
# Lib
require(dplyr)
# Summary
mt_sum <- mtcars %>%
group_by(am) %>%
summarise_each(funs(min, mean, median, max), mpg, cyl) %>%
mutate(am = as.character(am)) %>%
left_join(y = as.data.frame(table(mtcars$am),
stringsAsFactors = FALSE),
by = c("am" = "Var1"))
代码产生预期的结果:
> head(mt_sum)
Source: local data frame [2 x 10]
am mpg_min cyl_min mpg_mean cyl_mean mpg_median cyl_median mpg_max cyl_max Freq
(chr) (dbl) (dbl) (dbl) (dbl) (dbl) (dbl) (dbl) (dbl) (int)
1 0 10.4 4 17.14737 6.947368 17.3 8 24.4 8 19
2 1 15.0 4 24.39231 5.076923 22.8 4 33.9 8 13
但是,我对列的排序方式不满意。特别是,我想:
按名称对列进行排序
通过
select()indplyr实现这一目标
想要的顺序
所需的顺序如下所示:
> names(mt_sum)[order(names(mt_sum))]
[1] "am" "cyl_max" "cyl_mean" "cyl_median" "cyl_min" "Freq" "mpg_max"
[8] "mpg_mean" "mpg_median" "mpg_min"
尝试
理想情况下,我想通过names(mt_sum)[order(names(mt_sum))] 对select() 中的列进行排序。但是代码:
mt_sum <- mtcars %>%
group_by(am) %>%
summarise_each(funs(min, mean, median, max), mpg, cyl) %>%
mutate(am = as.character(am)) %>%
left_join(y = as.data.frame(table(mtcars$am),
stringsAsFactors = FALSE),
by = c("am" = "Var1")) %>%
select(names(.)[order(names(.))])
将返回预期的错误:
Error: All select() inputs must resolve to integer column positions. The following do not: * names(.)[order(names(.))]
在我的真实数据中,我生成了大量的汇总列。因此,我的问题是,如何将已排序的列名动态传递给 dplyr 中的 select(),以便它能够理解并应用于手头的 data.frame?
我的重点是找出一种将动态生成的列名传递给select() 的方法。我知道我可以对base 中的列或通过键入名称进行排序,如here 所讨论的那样。
【问题讨论】: