在R中对数据框列的迭代组合应用自定义求和函数
自定义R函数实现按列组合逐行求和
没问题,我帮你写一个完全符合需求的自定义函数,下面一步步来:
函数思路
- 首先区分数据框里的描述列和数值列(v1到v20这类0/1列)
- 根据你传入的分组参数(比如3),把数值列分成若干连续的组
- 对每组的列逐行求和,生成以组内第一列名称加
s结尾的新列(比如v1-v3的和叫v1s) - 最后把原描述列和所有新生成的求和列合并成结果数据框
完整函数代码
sum_col_groups <- function(df, group_size, desc_col = 1) { # 提取描述列 desc_data <- df[, desc_col, drop = FALSE] # 提取数值列(排除描述列) value_cols <- df[, -desc_col, drop = FALSE] # 计算分组数量 num_groups <- ceiling(ncol(value_cols) / group_size) # 初始化存储结果的列表 sum_results <- list() # 循环处理每个分组 for (i in 1:num_groups) { # 确定当前分组的列索引范围 start_col <- (i - 1) * group_size + 1 end_col <- min(i * group_size, ncol(value_cols)) # 提取当前分组的列 current_group <- value_cols[, start_col:end_col, drop = FALSE] # 逐行求和 group_sum <- rowSums(current_group) # 生成新列名(用分组第一列的名字加"s") new_colname <- paste0(colnames(current_group)[1], "s") # 把结果存入列表 sum_results[[new_colname]] <- group_sum } # 合并描述列和所有求和列 result_df <- cbind(desc_data, as.data.frame(sum_results)) return(result_df) }
用法演示
先创建一个测试数据框,包含1个描述列和20个0/1列:
# 生成测试数据 set.seed(123) # 固定随机种子,结果可复现 test_df <- data.frame( desc = paste0("item", 1:5), matrix(sample(c(0,1), 5*20, replace = TRUE), nrow = 5) ) colnames(test_df)[2:21] <- paste0("v", 1:20) # 调用函数,分组大小设为3 result <- sum_col_groups(test_df, group_size = 3) # 查看结果 print(result)
运行后你会看到,结果里保留了desc列,同时新增了v1s(v1+v2+v3的和)、v4s(v4+v5+v6的和)...最后一组因为20除以3余2,所以v19s是v19+v20的和,完全符合你的需求!
额外说明
- 如果你的描述列不是第一列,可以通过
desc_col参数指定列的位置或名称,比如desc_col = "my_desc_col" - 数值列不需要严格叫v1到v20,只要是连续的数值列(除了描述列)都可以处理
- 分组大小可以任意调整,比如设为4的话,就会每4列一组求和
内容的提问来源于stack exchange,提问作者gaspers
相关产品推荐
相关产品推荐

