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

基于未知多Location分组汇总DataFrame中Codes的自动化函数需求

我来帮你解决这个适配未知Location数量的自动化汇总问题!先看完整的解决方案,分几种方式实现,你可以根据自己的习惯选择:


先补全可运行的示例数据

你提供的原始代码里Cases变量未定义,我先补全示例数据,方便后续测试:

Cases <- 1:7  # 假设是7个案例
Codes <- c("70", "70", "60", "60", "60", "60", "50")
Locations <- c("a", "a", "a", "b", "b", "b", "b")
df <- data.frame(Cases, Codes, Locations)

方法1:用dplyr + purrr实现自动化分组汇总

你提到用group_split后没法执行group_by,其实是没对拆分后的列表元素逐个处理!我们可以用purrr::map遍历每个Location的子集,再单独做汇总:

library(dplyr)
library(purrr)

# 定义适配任意Location数量的函数
summarize_by_location <- function(data) {
  # 按Location拆分数据,保留其他列
  data_split <- data %>% group_split(Locations, .keep = TRUE)
  
  # 遍历每个子集,汇总Codes对应的案例数
  result_list <- map(data_split, function(sub_df) {
    sub_df %>%
      group_by(Codes) %>%
      summarize(Count = n(), .groups = "drop") %>%
      # 给当前结果标记对应的Location
      mutate(Location = unique(sub_df$Locations))
  })
  
  # 给列表元素命名,方便快速定位不同Location的结果
  names(result_list) <- paste0("Location_", unique(data$Locations))
  
  return(result_list)
}

# 调用函数查看结果
location_summary <- summarize_by_location(df)

# 查看Location a的汇总结果
location_summary$Location_a
#>   Codes Count Location
#> 1    60     1        a
#> 2    70     2        a

# 查看Location b的汇总结果
location_summary$Location_b
#>   Codes Count Location
#> 1    50     1        b
#> 2    60     3        b

方法2:用Base R实现(无需额外加载包)

如果你不想依赖dplyr和purrr,用Base R的split+lapply也能搞定:

summarize_by_location_base <- function(data) {
  # 按Location拆分数据
  data_split <- split(data, data$Locations)
  
  # 遍历每个子集生成汇总表
  result_list <- lapply(data_split, function(sub_df) {
    count_table <- table(sub_df$Codes)
    data.frame(
      Codes = names(count_table),
      Count = as.integer(count_table),
      Location = unique(sub_df$Locations)
    )
  })
  
  return(result_list)
}

# 调用函数
location_summary_base <- summarize_by_location_base(df)

调整为你预期的输出格式

如果你希望结果列名是Codes+Location X的形式(比如你给出的Codes Location A),可以修改函数自定义列名:

summarize_by_location_custom <- function(data) {
  data_split <- split(data, data$Locations)
  
  result_list <- lapply(names(data_split), function(loc_name) {
    sub_df <- data_split[[loc_name]]
    count_table <- table(sub_df$Codes)
    # 用!!和:=动态生成列名
    data.frame(
      Codes = names(count_table),
      !!paste0("Location_", loc_name) := as.integer(count_table)
    )
  })
  
  names(result_list) <- paste0("Location_", names(data_split))
  return(result_list)
}

# 调用后查看匹配预期的结果
custom_summary <- summarize_by_location_custom(df)
custom_summary$Location_a
#>   Codes Location_a
#> 1    60          1
#> 2    70          2

custom_summary$Location_b
#>   Codes Location_b
#> 1    50          1
#> 2    60          3

为什么你之前的group_split尝试没成功?

你说group_split返回的tibble列表无法执行group_by,其实是操作对象错了——group_split返回的是多个独立的tibble组成的列表,你需要对列表里的每个元素单独执行group_by+summarize,而不是直接对整个列表执行操作。

内容的提问来源于stack exchange,提问作者user13267770

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 14:57:42