You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

R中按列名模式对可变列数(2-3列)求和的优雅实现方案

问题:基于列名模式的DataFrame分组求和优化

我有一个10列的DataFrame,需要按以下规则分组求和后生成新的DataFrame:

  • 前4列:以on_b_开头的列作为分组起点,每2列(on_b_+off_b_)为一组求和,即第1列+第2列、第3列+第4列分别计算总和
  • 后6列:同样以on_b_开头的列作为分组起点,每3列(on_b_+中间无关列+off_b_)为一组求和,即第5列+第6列+第7列、第8列+第9列+第10列分别计算总和

核心要求:函数能自动识别on_b_开头的列作为分组起始点,动态匹配每组的列数(前两组每组2列,后两组每组3列)。

目前我通过两次sapply、转置和cbind实现了需求,但希望得到更简洁优雅的解决方案。

可复现代码

df = structure(list(on_b_pos_1 = 64, off_b_4 = 25, 
                    on_b_6 = 28, off_b_8 = 157, 
                    on_b_3 = 42, CC_2 = 0,  off_b_4 = 125, 
                    on_b_5 = 51, CC_7 = 0, off_b_8 = 15), 
               row.names = 14L, class = "data.frame")

现有手动实现代码

# 前4列每2列一组求和
a <- data.frame(sapply(seq(1,4,by=2),function(i) rowSums(df[,i:(i+1)])))
# 后6列每3列一组求和
b <- data.frame(sapply(seq(5,ncol(df),by=3),function(i) rowSums(df[,i:(i+2)])))
# 转置后合并结果
a <- t(a)
b <- t(b)
c <- cbind(a, b)

优雅解决方案(动态分组)

利用列名的模式自动识别分组起点,再动态计算每组的列数,最后统一求和:

# 识别所有以on_b_开头的列的位置(分组起点)
group_starts <- which(startsWith(colnames(df), "on_b_"))

# 计算每个分组的列数:相邻起点的差值,最后一组用总列数减去最后一个起点+1
group_lengths <- c(diff(group_starts), ncol(df) - tail(group_starts, 1) + 1)

# 生成每个分组对应的列索引
groups <- mapply(function(start, len) start:(start + len - 1), group_starts, group_lengths)

# 对每个分组求和并整理成DataFrame
result <- data.frame(t(sapply(groups, function(cols) rowSums(df[, cols]))))
colnames(result) <- paste0("Column ", 1:ncol(result))

预期结果

Column 1 Column 2 Column 3 Column 4
      89      185      167       66

内容的提问来源于stack exchange,提问作者Ingrid

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 07:52:47