在group_by中使用列索引而不是名称

时间:2017-09-26 22:02:44

标签: r dplyr

我想用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。

4 个答案:

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