在data.table中逐行迭代运行

Tha*_*ang 0 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
Run Code Online (Sandbox Code Playgroud)

现在,我想逐行计算e的值,e的值等于(c + d)倍与前一行的e.所以数据表必须在这里逐行更新.我不想在这里运行for循环,因为它需要很长时间.你们有什么建议吗?

Rol*_*and 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
Run Code Online (Sandbox Code Playgroud)

编辑:

这是一个使用的解决方案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))]
Run Code Online (Sandbox Code Playgroud)

这里有一个解决方案set:

a[1, g := 1]
for (i in 2 : nrow(a)) set(a, i, "g", a[(i), c + d] * a[(i - 1), g])
Run Code Online (Sandbox Code Playgroud)

  • @ThanhQuang迭代data.table的行不是一个好主意.无论你如何做(`for`循环或使用data.table的`by`),它总是很慢.您应该像我在此处所示,找到针对您的特定问题的矢量化解决方案.如果其他一切都失败了,你可以随时转向Rcpp. (2认同)