如何用dplyr惯用方法将分组聚合结果转为列格式?
优化解决方案(符合dplyr/tidyverse风格)
你可以结合dplyr和tidyr(同属tidyverse生态)的pivot_wider函数,一步完成分组求和+长表转宽表的操作,完全适配type多类别的场景,代码简洁且易维护:
完整代码示例
# 加载依赖包 library(dplyr) library(tidyr) # 生成测试数据 set.seed(123) test_data <- data.frame( sample = sample(LETTERS[1:10], 100, replace = TRUE), type = sample(letters[1:2], 100, replace = TRUE), area = sample(1:100, replace = TRUE) ) # 分组求和并转宽表 res_df <- test_data %>% group_by(sample, type) %>% summarise(area_sum = sum(area), .groups = "drop") %>% # 分组求和,取消分组避免后续警告 pivot_wider( names_from = type, # 用type的取值作为新列名的一部分 values_from = area_sum, # 填充到新列的数值来源 names_prefix = "area." # 给新列名添加前缀,生成area.a/area.b格式 ) # 查看结果 head(res_df)
输出结果
# A tibble: 6 × 3 sample area.a area.b <chr> <int> <int> 1 A 244 147 2 B 17 152 3 C 153 541 4 D 107 94 5 E 246 266 6 F 189 286
关键说明
- 自动适配多类别:如果
type新增c、d等类别,代码无需修改,会自动生成area.c、area.d这类列 - 符合tidyverse风格:全程使用管道符
%>%串联操作,逻辑清晰,避免手动拆分、合并数据框的繁琐步骤 .groups = "drop":dplyr 1.0.0+版本建议在summarise后明确分组处理方式,这里取消分组是为了后续pivot_wider操作更顺畅
内容的提问来源于stack exchange,提问作者Fabrizio
相关产品推荐
相关产品推荐

