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

如何在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会变成:

idyear_2019year_2020year_2021cumulative_year_2019cumulative_year_2020cumulative_year_2021
1502557
2115127
392491115

大数据量高效替代方案

如果数据集规模较大,apply效率不足,可以用matrixStats包的rowCumsums函数,省去转置操作:

library(matrixStats)
dt[, (paste0("cumulative_", year_columns)) := as.data.table(rowCumsums(as.matrix(.SD))), .SDcols = year_columns]

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 07:23:21