如何在R中按行计算列累积和并除以对应total_min值
问题解决:按行计算累积和并除以对应total_min值
错误原因
你之前的代码dat[,2:6] <- t(apply(dat[,2:6], 1, cumsum)/dat$total_min)出错,核心问题是维度不匹配导致循环补齐错误:dat$total_min是长度为3的向量,当你把apply返回的每行累积和(长度5)和这个向量做除法时,R会自动循环补齐,导致每行的累积和重复除以total_min的所有值,而非仅除以该行对应的total_min。
正确实现方式
方法1:基础R实现(直接按行处理)
先修正原始数据集的定义(你提供的dat代码与Table1数值不一致,需对齐),再通过sapply按行索引处理,确保每行累积和仅除以该行的total_min:
# 加载与Table1一致的原始数据 dat <- data.frame( stringsAsFactors = FALSE, flower = c("lily", "rose", "daisy"), x1902 = c(23L, 50L, 30L), x1950 = c(0L, 60L, 7L), x2010 = c(0L, 5L, 10L), x2012 = c(8L, 16L, 2L), x2021 = c(5L, 0L, 0L), total_min = c(5L, 5L, 2L) ) # 按行计算累积和并除以对应total_min dat[, 2:6] <- t(sapply(seq_len(nrow(dat)), function(i) { cumsum(dat[i, 2:6]) / dat$total_min[i] }))
方法2:tidyverse风格(更直观)
如果习惯管道式操作,用dplyr的rowwise()按行处理,结合c_across实现跨行累积计算:
library(dplyr) dat <- dat %>% rowwise() %>% mutate(across(x1902:x2021, ~ cumsum(c_across(x1902:x2021))[cur_column()] / total_min)) %>% ungroup()
最终结果
运行后得到与你期望完全一致的结果:
| flower | x1902 | x1950 | x2010 | x2012 | x2021 | total_min |
|---|---|---|---|---|---|---|
| lily | 4.6 | 4.6 | 4.6 | 6.2 | 7.2 | 5 |
| rose | 10 | 22 | 23 | 26.2 | 26.2 | 5 |
| daisy | 15 | 18.5 | 23.5 | 24.5 | 24.5 | 2 |
内容的提问来源于stack exchange,提问作者Shae11
相关产品推荐
相关产品推荐

