如何在R语言中用data.table实现固定一端的滚动求和
用data.table一行实现逐行累加的方案
一行代码实现
直接借助R内置的cumsum()函数就能完成逐行累加,这是最简洁的实现方式,完全不需要循环:
library(data.table) library(ggplot2) mpg <- data.table(mpg) mpg[, new := cumsum(displ)]
cumsum()会自动对displ列做逐行累积求和,第一行结果就是displ[1],第二行是displ[1]+displ[2],以此类推,完全符合需求。
关于循环中必须用mpg$displ的原因
在你的循环代码里,mpg[i, new := mpg$displ[i]+mpg$new[i-1]]中,如果换成直接写displ和new,会出现逻辑问题:
- data.table在
i位置指定行号后,j环境里的列名是对应当前行子集的列,而非整个数据表的列。 - 比如写
displ时,它等价于mpg[i, displ],也就是第i行的displ值,这部分其实没问题;但new[i-1]会被理解为从当前行子集(仅第i行)的new列中取第i-1个元素,这显然不存在,会引发错误。 - 而用
mpg$displ和mpg$new是直接引用整个数据表的列,能正确定位到对应行的数值,所以才能正常运行。
无需使用setkey()
setkey()的作用是给data.table设置主键,用于快速匹配、表连接等场景,和逐行累加的需求完全无关,这里根本不需要用到这个函数。
内容的提问来源于stack exchange,提问作者Dorian Grv
相关产品推荐
相关产品推荐

