如何在data.table中按行计算年份列累积和并更新列值
解决data.table行内年份列累积求和问题
问题原因
你用rowSums得到的是每行所有年份列的总和,而非截至当前年份的累积和,所以每个新列都会被赋值为同一行的总和。要实现逐列累积求和,需要对每行的年份列从左到右依次累加。
解决方案
先注意你示例里重复了year_2020列,建议先修正列名避免冲突,假设修正后的年份列列表是year_columns <- c("year_2019", "year_2020", "year_2021"),可以用以下代码:
library(data.table) # 修正重复列名(如果存在) setnames(dt, old = "year_2020", new = "year_2021", skip_absent = TRUE) year_columns <- c("year_2019", "year_2020", "year_2021") # 计算行内累积和并赋值给新列 dt[, (paste0("cumulative_", year_columns)) := as.data.table(t(apply(.SD, 1, cumsum))), .SDcols = year_columns]
代码解释
apply(.SD, 1, cumsum):对每行(MARGIN=1)的年份列执行累积求和,返回按列存储结果的矩阵(每行对应原数据的一列)。t():转置矩阵,让结果的行列对应原数据的行列。as.data.table():将转置后的矩阵转为data.table格式,方便直接赋值给新列。
验证结果
运行后你的data.table会变成:
| id | year_2019 | year_2020 | year_2021 | cumulative_year_2019 | cumulative_year_2020 | cumulative_year_2021 |
|---|---|---|---|---|---|---|
| 1 | 5 | 0 | 2 | 5 | 5 | 7 |
| 2 | 1 | 1 | 5 | 1 | 2 | 7 |
| 3 | 9 | 2 | 4 | 9 | 11 | 15 |
大数据量高效替代方案
如果数据集规模较大,apply效率不足,可以用matrixStats包的rowCumsums函数,省去转置操作:
library(matrixStats) dt[, (paste0("cumulative_", year_columns)) := as.data.table(rowCumsums(as.matrix(.SD))), .SDcols = year_columns]
内容的提问来源于stack exchange,提问作者TvCasteren
相关产品推荐
相关产品推荐

