在data.table中逐行迭代运行

时间:2016-09-29 12:33:31

标签: r data.table

我有一个与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循环,因为它需要很长时间。你们有什么建议吗?

1 个答案:

答案 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])