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
相关产品推荐
相关产品推荐

