如何在R中一次性按多个列分别对dataframe执行split/group_split操作
实现方案
可以通过purrr::map迭代需要单独分组的列名完成需求,无需重复编写拆分统计逻辑,同时支持追加分组标识,完整可运行代码如下:
library(tidyverse) # 示例数据 set.seed(1) df <- data.frame( group = c(rep("A",3), rep("B", 6)), test_value = c(0,1,2, 0,1,2,3,4,5), ff = rnorm(9, 0, 1), dd = c(rep("C", 5), rep("D", 4))) # 1. 定义需要单独分组的列向量,后续新增分组列只需修改此处即可 group_cols <- c("group", "dd") # 2. 迭代分组列完成拆分+统计,自动追加分组标识 result <- map(group_cols, function(col) { df %>% group_split(.data[[col]]) %>% map_dfr(~ .x %>% # 可按需自定义统计指标、统计列 summarise( mean = mean(ff, na.rm = TRUE), median = median(ff, na.rm = TRUE) ) %>% # 追加分组信息,方便识别结果对应维度 mutate( group_by_col = col, group_value = .x[[col]][1] ) ) }) # 给列表命名,方便直接提取对应分组列的结果 names(result) <- group_cols
结果查看
- 提取按
group列分组的统计结果:result$group
# A tibble: 2 × 4 mean median group_by_col group_value <dbl> <dbl> <chr> <chr> 1 -0.426 -0.626 group A 2 0.484 0.532 group B
- 提取按
dd列分组的统计结果:result$dd
# A tibble: 2 × 4 mean median group_by_col group_value <dbl> <dbl> <chr> <chr> 1 0.129 0.184 dd C 2 0.245 0.532 dd D
- 如果需要把所有维度的统计结果合并为一个总表,直接调用
bind_rows(result)即可。
扩展说明
该方案扩展性极强:
- 新增需要单独分组的列时,只需在
group_cols向量中追加列名即可,不需要重复编写统计逻辑 - 统计指标可以按需在
summarise中修改,也支持同时对多列计算统计值 - 习惯用基础
split函数的用户,可将group_split(.data[[col]])替换为split(., .[[col]]),运行逻辑完全一致
内容的提问来源于stack exchange,提问作者user63230
相关产品推荐
相关产品推荐

