如何按指定列分组自动汇总数据框中的所有因子列?
问题描述
我有一个包含3个因子列的data frame:cluster、sex、vaccination。希望以自动方式而非逐个处理,按cluster列分组获取sex和vaccination列的汇总信息。
单独处理一列时,以下代码可行:
cluster <- sample(1:4, size = 20, replace = TRUE) set.seed(10) sex <- sample(0:1, size = 20, replace = TRUE) set.seed(20) vaccine <- sample(0:1, size = 20, replace = TRUE) df <- as.data.frame(cbind(cluster,sex,vaccine)) df <- as.data.frame(lapply(df, as.factor)) # 单独汇总sex列 df %>% group_by(cluster, sex) %>% summarize(count = n())
但实际场景中有40个需要汇总的因子列,逐个编写代码效率极低。尝试用以下代码自动处理所有变量时出错:
df %>% group_by(cluster) %>% summarize(across(everything(), count = n()))
错误信息:
Error in
summarize():
ℹ In argument:across(everything(), count = n()).
ℹ In group 1:cluster = 1.
Caused by error inacross():
!...must be empty.
✖ Problematic argument:
• count = n()
请问是否有方法可获取所有其他因子列按指定列分组后的计数或占比?期望输出类似示例图中的格式(或包含各分类占比)。
解决方案
方法1:用across批量统计计数
调整across的用法,将计数逻辑封装为函数传入,自动处理除cluster外的所有列:
library(dplyr) df %>% group_by(cluster) %>% summarize(across(-cluster, ~ table(.) %>% as.data.frame(.) %>% rename_with(~ c(cur_column(), "count"), everything())))
该代码会为每个变量生成包含分类值和对应计数的嵌套数据框,可按需展开使用。
方法2:宽转长后统计(扁平化输出)
如果需要结构更直观的扁平化输出,先将数据转换为长格式再统一统计:
library(dplyr) library(tidyr) df %>% pivot_longer(-cluster, names_to = "variable", values_to = "category") %>% group_by(cluster, variable, category) %>% summarize(count = n(), .groups = "drop")
输出每行对应cluster-变量-分类的组合,清晰展示各组的计数结果。
方法3:同时统计计数与占比
若需要同时得到组内计数和分类占比,可在汇总后添加百分比计算:
library(dplyr) library(tidyr) df %>% pivot_longer(-cluster, names_to = "variable", values_to = "category") %>% group_by(cluster, variable, category) %>% summarize(count = n(), .groups = "drop_last") %>% mutate(percentage = round(count / sum(count) * 100, 2)) %>% ungroup()
输出包含count(计数)和percentage(组内百分比,保留两位小数)两列,满足占比统计需求。
内容的提问来源于stack exchange,提问作者Lander
相关产品推荐
相关产品推荐

