dplyr group_by中的复杂列选择

时间:2016-11-29 16:44:41

标签: r dataframe dplyr

我想在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语法)。我打算把这个打开一段时间。

2 个答案:

答案 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))