R语言数据框重复列名按行批量求和实现方法
R 重复列名按行累加合并的通用高效实现
适配场景
针对存在大量重复列名的全数值型数据框,实现逐行对同名列数值累加、最终输出仅保留唯一列名且保持原始列出现顺序的合并结果,完全匹配频道观看时长类数据的合并需求。
通用实现方案(基R无第三方依赖)
该方案走底层矩阵运算逻辑,对大样本数据效率远高于逐列循环,无需安装额外包:
- 构造原始数据时注意关闭自动重命名,避免重复列名被R自动改写:
# 构造和需求场景一致的测试数据 tv_viewing_time <- data.frame( channel_1 = c(1, 2, 3), channel_2 = c(2, 3, 4), channel_1 = c(4, 5, 6), channel_2 = c(5, 6, 7), check.names = FALSE ) # 校验原始列名,保留重复命名 colnames(tv_viewing_time) # 输出:"channel_1" "channel_2" "channel_1" "channel_2" - 执行同名列逐行累加合并:
# 提取按首次出现顺序排列的唯一列名 unique_col_names <- unique(colnames(tv_viewing_time)) # 逐列名匹配同名列,执行行求和 merged_df <- as.data.frame( sapply(unique_col_names, function(target_col) { col_subset <- tv_viewing_time[, colnames(tv_viewing_time) == target_col, drop = FALSE] rowSums(col_subset) }) )- 代码中的
drop = FALSE为必要参数:当某列不存在重复时,可避免筛选出的单列被自动转为向量,触发求和逻辑报错。
- 代码中的
- 校验合并结果:
完全匹配1(首个channel_1列)+4(第三个channel_1列)=5、2(第二个channel_2列)+5(第四个channel_2列)=7的预期结果。merged_df[1, ] # 输出:channel_1 channel_2 # 5 7
超大规模数据优化实现
如果数据集达到百万行以上规模,可使用data.table实现更快的聚合速度:
library(data.table) setDT(tv_viewing_time) unique_cols <- unique(names(tv_viewing_time)) merged_dt <- copy(tv_viewing_time[, .SD, .SDcols = unique_cols]) # 对每个存在重复的列做累加 for (col in unique_cols) { duplicate_cols <- names(tv_viewing_time)[names(tv_viewing_time) == col] if (length(duplicate_cols) > 1) { merged_dt[, (col) := Reduce(`+`, .SD), .SDcols = duplicate_cols] } }
常见适配调整
- 若列值存在缺失值
NA,可将rowSums(col_subset)替换为rowSums(col_subset, na.rm = TRUE),将Reduce(\+`)`调整为适配缺失值的累加逻辑,实现缺失值按0参与计算的效果 - 不要使用会打乱列顺序的聚合方法(如按列名字母排序的聚合逻辑),避免破坏原始数据中频道的排列规则
- 若数据中混有非数值列(如用户ID、年龄等标识列),可提前将标识列拆分出来,仅对数值型的频道列执行上述合并逻辑,最后再和标识列拼接即可。
内容的提问来源于stack exchange,提问作者Lola1993
相关产品推荐
相关产品推荐

