2017-09-26 78 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

相关问题