求助:编写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)
核心逻辑说明
- 列配对校验:先检查列数是否为偶数,避免出现无对应分组列的奇数列
- 逐对处理:对每一组奇偶列单独分组聚合,保留原列名,从根源避免列顺序混乱
- 智能合并:通过
full_join按共同分组列合并结果,确保行数正确,无冗余重复
内容的提问来源于stack exchange,提问作者KABILAN
相关产品推荐
相关产品推荐

