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

求助:编写R语言中基于偶索引列分组奇索引列的通用函数

解决方案:按偶索引列分组聚合奇索引列的通用函数

先给出模拟的示例输入数据框(匹配你描述的场景):

df <- data.frame(
  val1 = c(1, 2, 3, 4),
  group1 = c("A", "A", "B", "B"),
  val2 = c(5, 6, 7, 8),
  group2 = c("X", "Y", "X", "Y"),
  val3 = c(9, 10, 11, 12),
  group3 = c("P", "P", "Q", "Q")
)

以下是解决输出行数冗余、列顺序错乱问题的通用函数,基于dplyr包实现(需先安装并加载dplyr):

library(dplyr)

group_odd_by_even <- function(df, .f = sum) {
  # 提取奇偶列索引
  odd_cols <- seq(1, ncol(df), by = 2)
  even_cols <- seq(2, ncol(df), by = 2)
  
  # 校验列配对完整性
  if (length(odd_cols) != length(even_cols)) {
    stop("数据框列数需为偶数,保证每个奇数列对应一个偶数列作为分组依据")
  }
  
  # 逐对处理分组聚合
  result_list <- mapply(function(val_col, group_col) {
    val_name <- colnames(df)[val_col]
    group_name <- colnames(df)[group_col]
    
    df %>%
      group_by(!!sym(group_name)) %>%
      summarize(!!val_name := .f(!!sym(val_name)), .groups = "drop")
  }, odd_cols, even_cols, SIMPLIFY = FALSE)
  
  # 合并结果,自动匹配分组列
  final_result <- Reduce(function(x, y) full_join(x, y, by = intersect(colnames(x), colnames(y))), result_list)
  
  return(final_result)
}

使用示例

  • 默认采用求和聚合,可通过.f参数指定其他聚合函数(如mean、max):
# 求和聚合测试
group_odd_by_even(df)

# 均值聚合测试
group_odd_by_even(df, .f = mean)

核心逻辑说明

  1. 列配对校验:先检查列数是否为偶数,避免出现无对应分组列的奇数列
  2. 逐对处理:对每一组奇偶列单独分组聚合,保留原列名,从根源避免列顺序混乱
  3. 智能合并:通过full_join按共同分组列合并结果,确保行数正确,无冗余重复

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 10:33:27