【发布时间】:2021-01-04 17:16:53
【问题描述】:
我想使用不同的分组变量集对数据框进行分组。对于每个组,我想计算观察次数(或以任何其他方式总结),然后将所有结果收集到一个数据框中。
重要提示:我想以编程方式定义分组变量集,例如作为列表。
如何在 tidyverse 中实现这一点?
这是我的尝试:
library(tidyverse)
count_by_group <- function(...) {
mtcars %>%
count(...) %>%
mutate(
grouping_variable = paste(ensyms(...), collapse = "."),
group = paste(!!!enquos(...), sep = ".")
) %>%
select(grouping_variable, group, n)
}
# I want this ...
bind_rows(
count_by_group(cyl),
count_by_group(gear),
count_by_group(cyl, gear)
)
#> grouping_variable group n
#> 1 cyl 4 11
#> 2 cyl 6 7
#> 3 cyl 8 14
#> 4 gear 3 15
#> 5 gear 4 12
#> 6 gear 5 5
#> 7 cyl.gear 4.3 1
#> 8 cyl.gear 4.4 8
#> 9 cyl.gear 4.5 2
#> 10 cyl.gear 6.3 2
#> 11 cyl.gear 6.4 4
#> 12 cyl.gear 6.5 1
#> 13 cyl.gear 8.3 12
#> 14 cyl.gear 8.5 2
# ... but without the repetition of "count_by_group(var)".
# The following does not work:
map_dfr(
list(
cyl,
gear,
c(cyl, gear)
),
count_by_group
)
#> Error in map(.x, .f, ...): object 'cyl' not found
由reprex package (v0.3.0) 于 2020-09-17 创建
【问题讨论】:
-
也许你需要
rollup聚合即rollup(as.data.table(mtcars), j = .N, by = c("cyl","gear")) -
你所做的有什么问题?
-
@AllanCameron 我猜 Op 的代码不适用于帖子末尾的
map -
如果您使用
map_dfr(rlang::exprs(cyl, gear), count_by_group)应该可以工作,但最后一个带有c的表达式不是您在工作案例中显示的预期行为