我有一个与R中的数据表有关的问题 例如,我有这样的数据
a=data.table(c=(1:10),d=(2:11))
a[1,e:=1]
c d e
1: 1 2 1
2: 2 3 NA
3: 3 4 NA
4: 4 5 NA
5: 5 6 NA
6: 6 7 NA
7: 7 8 NA
8: 8 9 NA
9: 9 10 NA
10: 10 11 NA
现在,我想逐行计算e的值,e等于(c + d)的值乘以前一行的e。所以数据表必须在这里逐行更新。 我不想在这里运行for循环,因为它需要很长时间。你们有什么建议吗?
答案 0 :(得分:7)
喜欢这个吗?
a[-1, e := c + d]
a[, e := cumprod(e)]
# c d e
# 1: 1 2 1
# 2: 2 3 5
# 3: 3 4 35
# 4: 4 5 315
# 5: 5 6 3465
# 6: 6 7 45045
# 7: 7 8 675675
# 8: 8 9 11486475
# 9: 9 10 218243025
#10: 10 11 4583103525
修改强>
以下是使用by
的解决方案。但是,这不会比编写良好的for
循环更快(例如,使用set
)。
a[1, f := 1]
a[, f := if (.GRP == 1) f
else (c + d) * a[.GRP - 1, f] , by = seq_len(nrow(a))]
这是一个set
的解决方案:
a[1, g := 1]
for (i in 2 : nrow(a)) set(a, i, "g", a[(i), c + d] * a[(i - 1), g])