【发布时间】:2021-08-04 22:52:26
【问题描述】:
我试图了解dplyr::group_by() 的预期输出以及dplyr::all_of() 的使用。我的理解是使用dplyr::all_of() 应该将包含变量名的字符向量转换为裸名,以便group_by(),但这似乎不会发生。
下面,我生成一些假数据,将不同的对象传递给group_by() with(out) all_of(),并计算每组的观察次数。在示例中,传递一个没有dplyr::all_of() 的裸列名称会产生正确的输出:每个列的唯一值一行。但是,传递字符向量或使用 dplyr::all_of() 会产生不正确的输出:不管一列中有多少值,都是一行。
使用 all_of 时会发生什么?我如何将字符向量传递给 group_by 以将其作为裸名向量进行处理?
library(dplyr)
# Create a 20-row data.frame with
# 2 variables each with 2 unique values.
df <- data.frame(var = rep(c("a", "b"), 10),
bar = rep(c(1, 2), 20))
# Output 1: 2x2 tibble - GOOD
df %>% group_by(var) %>% summarize(n = n())
# Output 2: 1x2 tibble - BAD
foo <- "var"
df %>% group_by(all_of(foo)) %>% summarize(n = n())
# Output 3: 1x2 tibble
df %>% group_by("var") %>% summarize(n = n())
# Output 4: Error in_var not found - BAD
foo2 <- list("var", "bar")
lapply(foo2, function(in_var) {
df %>%
group_by(in_var) %>%
summarize(n = n())
})
# Output 5: list of length 2 where
# each element is a 1x2 tibble - BAD
foo2 <- list("var", "bar")
lapply(foo2, function(in_var) {
df %>%
group_by(all_of(in_var)) %>%
summarize(n = n())
})
【问题讨论】:
-
如果您使用的是 dplyr >= 1.0.0,第二个问题的选项是使用
group_by和across -
我想你想要
df %>% group_by(across(all_of(foo))) %>% summarize(n = n())和最新版本的dplyr
标签: r vector dplyr summarize data-wrangling