2017-09-26 76 views
2

的名字,我想總結與dplyr一個數據幀,像這樣:使用列索引,而不是在GROUP_BY

> test <-data.frame(ID = c("A", "A", "B", "B"), val = c(1:4)) 
> test %>% group_by(ID) %>% summarize(av = mean(val)) 
# A tibble: 2 x 2 
     ID av 
    <fctr> <dbl> 
1  A 1.5 
2  B 3.5 

但是假設,而不是由所謂的列分組「ID」我想小組第一列,而不管它的名字。有沒有簡單的方法來做到這一點?

我已經嘗試了一些幼稚的方法(group_by(1)group_by(.[1])group_by(., .[1])group_by(names(.)[1])無濟於事。我纔剛剛開始使用tidyverse包,所以我可能會丟失一些東西明顯。

This question非常相似,但它是關於mutate的,我無法將其推廣到我的問題This question也是類似的,但接受的答案是使用不同的包,並且我試圖堅持dplyr.

回答

5

可以使用的一個作用域變種(group_by_at)本:

test %>% group_by_at(1) %>% summarise(av = mean(val)) 

# A tibble: 2 x 2 
#  ID av 
# <fctr> <dbl> 
#1  A 1.5 
#2  B 3.5 
3

你可以使用與dplyr::group_by_標準評估:

test %>% 
group_by_(names(.)[1]) %>% 
summarize(av = mean(val)) 
## A tibble: 2 x 2 
#  ID av 
# <fctr> <dbl> 
#1  A 1.5 
#2  B 3.5 
+0

評價標準現在已廢棄](http://dplyr.tidyverse.org/reference/se-deprecated.html )。 – Lyngbakr

2

如果我們需要使用NSE,然後sym!!可用於

test %>% 
    group_by(!! rlang::sym(names(.)[1])) %>% 
    summarise(av = mean(val)) 
# A tibble: 2 x 2 
#  ID av 
# <fctr> <dbl> 
#1  A 1.5 
#2  B 3.5 

我們也可以創建一個函數。如果我們通過引用的字符串,然後我們用sym!!要不然去爲enquo/!!路線

f1 <- function(dat, grp, valueCol) { 
    dat %>% 
     group_by(!! rlang::sym(grp)) %>% 
     summarise(av = mean(!! rlang::sym(valueCol))) 
} 

f1(test, "ID", "val") 
# A tibble: 2 x 2 
#  ID av 
# <fctr> <dbl> 
#1  A 1.5 
#2  B 3.5 
+1

這比我實際需要解決的問題要複雜得多,但它讓我開始關注評估和[使用dplyr編程]富有成效的學習路徑(http://dplyr.tidyverse.org/articles/programming.html) – Joe

相關問題