You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 01:51:00