如何在R data.table中以列值为求和上限生成新列?
在data.table中生成1到x的求和列y
最优方案:利用等差数列求和公式
1到n的和有现成的数学公式:n*(n+1)/2,这是矢量化操作,无需逐行计算,速度极快,完全适配data.table的语法,不管x列的数值是否有序、是否有规律都能用:
library(data.table) dt <- data.table(x = c(2,3,4,5)) # 示例数据 dt[, y := x * (x + 1) / 2]
运行后结果完全符合需求:
| x | y |
|---|---|
| 2 | 3 |
| 3 | 6 |
| 4 | 10 |
| 5 | 15 |
逐行计算的data.table写法(适合类似逐行操作场景)
如果遇到无法用公式简化的逐行计算需求,可以用sapply实现逐行处理:
dt[, y := sapply(x, function(n) sum(1:n))]
这种方式会遍历x的每个元素,计算对应1到n的和,但效率远低于公式法,数据量大时不推荐。
为什么之前的写法出错?
你用的dt[,y:=sum(c(1:x))]会报错/警告,是因为在data.table的j表达式中,x是整个列的向量,1:x会被解析为从1到x向量的第一个元素(当x是多元素向量时,R会抛出警告),而sum()是对整个生成的向量求和,最终得到一个单一值并重复赋值给所有行,自然不是逐行的结果。
内容的提问来源于stack exchange,提问作者cbw
相关产品推荐
相关产品推荐

