如何对两个列名相同的列表按行求和对应列的值?
解决方案:对两个同结构数据框的同名列按行求和
首先说明:你提到的“列表”应该是数据框(data frame),以下基于数据框结构提供几种可行方法:
问题分析
你原代码的问题在于:bind_cols会生成重复列名(如两个Time、两个Nuc_11),而group_by(!!!NucID)是按所有列分组,完全不符合“对应行同名列求和”的逻辑,因此无法得到正确结果。
方法1:基础R(最简洁)
利用数据框的向量运算特性,直接对对应列相加:
# 保留Time列(两个数据框的Time完全一致,取任意一个即可) SisSum <- Sis1[, "Time", drop = FALSE] # 对除Time外的所有列逐行求和 SisSum[, -1] <- Sis1[, -1] + Sis2[, -1]
方法2:dplyr(可读性强)
使用mutate+across实现对应列的逐行相加:
library(dplyr) SisSum <- Sis1 %>% mutate(across(-Time, ~ .x + Sis2[[cur_column()]]))
across(-Time):指定对除Time外的所有列操作cur_column():获取当前操作的列名,确保从Sis2中取对应列的值
方法3:data.table(大数据量高效)
适合处理大型数据集,运算效率更高:
library(data.table) # 转换为data.table格式 setDT(Sis1) setDT(Sis2) # 计算求和结果 sum_cols <- setdiff(names(Sis1), "Time") SisSum <- Sis1[, c(list(Time = Time), lapply(sum_cols, function(col) .SD[[col]] + Sis2[[col]])), .SDcols = names(Sis1)] # 恢复原列名(可选,因为lapply返回的列默认命名为V1、V2...) setnames(SisSum, tail(names(SisSum), -1), sum_cols)
内容的提问来源于stack exchange,提问作者AlbertQuackstein
相关产品推荐
相关产品推荐

