You need to enable JavaScript to run this app. R语言数据框重复列名按行批量求和实现方法
优惠活动
大模型
产品
解决方案
定价
更多

R语言数据框重复列名按行批量求和实现方法

R 重复列名按行累加合并的通用高效实现

适配场景

针对存在大量重复列名的全数值型数据框,实现逐行对同名列数值累加、最终输出仅保留唯一列名且保持原始列出现顺序的合并结果,完全匹配频道观看时长类数据的合并需求。

通用实现方案(基R无第三方依赖)

该方案走底层矩阵运算逻辑,对大样本数据效率远高于逐列循环,无需安装额外包:

  1. 构造原始数据时注意关闭自动重命名,避免重复列名被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"
    
  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为必要参数:当某列不存在重复时,可避免筛选出的单列被自动转为向量,触发求和逻辑报错。
  3. 校验合并结果:
    merged_df[1, ]
    # 输出:channel_1  channel_2 
    #         5         7
    
    完全匹配1(首个channel_1列)+4(第三个channel_1列)=5、2(第二个channel_2列)+5(第四个channel_2列)=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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.27 16:54:04