根据前一行中的值计算单元格中的值的快速方法

我希望有一种快速的方法来处理行式计算,其中单元格的值取决于不同列的前几行中的值,更喜欢矢量化而不是循环遍历各个行(从这里开始)。

假设我有以下数据集dt和一个constant(加载的库是data.table,dplyrpurrr

dt <- structure(list(var1 = c(-92186.7470607738, -19163.5035325072, 
-18178.8396858014, -9844.67882723287, -16494.7802822178, -17088.0576319257
), var2 = c(-3.12, NA, NA, NA, NA, NA), var3 = c(1, NA, NA, NA, 
NA, NA)), class = c("data.table", "data.frame"), row.names = c(NA, 
-6L))

constant <- 608383


print(dt)
         var1  var2 var3
1: -92186.747 -3.12    1
2: -19163.504    NA   NA
3: -18178.840    NA   NA
4:  -9844.679    NA   NA
5: -16494.780    NA   NA
6: -17088.058    NA   NA

快速的矢量化等价于

for(i in 2:nrow(dt)){
  prev <- dt[(i-1),]
  dt[i, var2 := prev$var2 - var1/constant]
}

将是

dt %>%
  mutate(var2 = accumulate(var1[-1], .init = var2[1], ~ .x - .y /constant))

但是如果我想在计算中包含更多列怎么办?在这个例子中var3,但在真实数据集中有 >10 列。我希望解决方案考虑到这一点。循环示例(所需输出):

for(i in 2:nrow(dt)){
  prev <- dt[(i-1),]
  dt[i, var2 := prev$var2 + prev$var3 - var1/constant]
  dt[i, var3 := prev$var1 + 0.1 * var2/constant]
}
print(dt)

         var1          var2      var3
1: -92186.747 -3.120000e+00      1.00
2: -19163.504 -2.088501e+00 -92186.75
3: -18178.840 -9.218881e+04 -19163.52
4:  -9844.679 -1.113523e+05 -18178.86
5: -16494.780 -1.295311e+05  -9844.70
6: -17088.058 -1.393758e+05 -16494.80

以上是根据前一行中的值计算单元格中的值的快速方法的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>