我想在group_by
调用,dplyr的列选择器中使用,例如starts_with()
,ends_with()
,matches()
,...,甚至语法-colName
。
(愚蠢)我所遵循的语法示例:
library("dplyr")
# I would like to do something like this
mtcars %>%
group_by(matches("a")) %>%
summarise(mpg=mean(mpg))
# but I get a "wrong result size" error
我希望它能起作用,类似于:
mtcars %>% select(matches("a"))
这里会选择列drat, am, gear, carb
要清楚:我想使用matches("a")
(或等效物)来实现与以下相同的输出:
mtcars %>%
group_by(drat, am, gear, carb) %>%
summarise(mpg=mean(mpg))
我只对使用dplyr的答案感兴趣。谢谢!
当前答案虽然不错,但只允许选择带正则表达式的列。
我仍在寻找更全面的答案,允许使用全系列的dplyr选择语法。当然,我可以按下任何正则表达式来选择我想要的东西,但我希望我有一些能与dplyr集成更好的东西(尤其是使用-colName
语法)。我打算把这个打开一段时间。
答案 0 :(得分:4)
以下是构建您自己的group_at()
的选项,我认为matches
和SE group_by_()
函数不存在这些选项:
mtcars %>%
group_by_(.dots = names(mtcars)[matches("a", vars = names(mtcars))]) %>%
summarise(mpg = mean(mpg))
#Source: local data frame [26 x 5]
#Groups: drat, am, gear [?]
# drat am gear carb mpg
# <dbl> <dbl> <dbl> <dbl> <dbl>
#1 2.76 0 3 1 18.10
#2 2.76 0 3 2 15.50
#3 2.93 0 3 4 10.40
#4 3.00 0 3 4 10.40
#5 3.07 0 3 3 16.30
#6 3.08 0 3 1 21.40
#7 3.08 0 3 2 19.20
#8 3.15 0 3 2 16.95
#9 3.21 0 3 4 14.30
#10 3.23 0 3 4 14.70
# ... with 16 more rows
或者等效地,只需使用grep
:
mtcars %>%
group_by_(.dots = grep('a', names(mtcars), value = TRUE)) %>%
summarise(mpg=mean(mpg))
答案 1 :(得分:0)
group_by_at
在2017年的某个时候被添加到了dplyr中。
mtcars %>%
group_by_at(matches("a")) %>%
summarise(mpg=mean(mpg))