2016-11-29 59 views
3

我想一個group_by呼叫內使用,,dplyr的列選擇像starts_with()ends_with()matches(),......,甚至語法-colName複雜列選擇在dplyr GROUP_BY

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語法)。我打算把這個打開一會兒。

回答

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)) 
+2

你可以避免使用'grep(「a」,名稱(mtcars),val = TRUE)對名稱進行雙重調用' –

+0

@PierreLafortune Right。把它給忘了。 – Psidom

+0

非常感謝這兩個,我將這添加到我的方便功能! 'group_at < - function(df,pattern)group_by_(df,.dots = grep(names(df),pattern = pattern,value = T))' –