我想用dplyr总结一个数据帧,如下所示:
ilclient:
mkdir -p libs
cp -ru /opt/vc/src/hello_pi/libs/ilclient libs
make -C libs/ilclient
但是假设不是通过名为" ID"的列进行分组。我希望按第一栏分组,不论其名称如何。有没有一种简单的方法可以做到这一点?
我尝试了一些天真的方法(> 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
,group_by(1)
,group_by(.[1])
,group_by(., .[1])
无济于事。我只是刚刚开始使用tidyverse包,所以我可能会遗漏一些明显的东西。
This question非常相似,但它是关于变异的,我无法将其概括为我的问题。 This question也类似,但接受的答案是使用不同的包,我试图坚持使用dplyr。
答案 0 :(得分:10)
您可以使用其中一个范围变体(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
答案 1 :(得分: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
答案 2 :(得分: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
答案 3 :(得分:1)
您可以使用across
版的1.0.0
功能:
library(dplyr)
test %>%
group_by(across(1)) %>%
summarise(av = mean(val))
## A tibble: 2 x 2
# ID av
# <fct> <dbl>
#1 A 1.5
#2 B 3.5