按顺序更新 data.table 中的行

sequentially update rows in data.table

我有一个非常大的数据集,我想在 R 中使用 data.table:

执行以下计算
library(data.table)

# This is a test dataset
tempData <-data.table(
  drugName = rep("Aspirine", times = 4),
  startdt = c("2012-01-01",
              "2012-01-20",
              "2012-02-15",
              "2012-03-10"),
  daysupp = c(30,30,10,20))


# An example of the desired computation
tempData[, startdt:= as.Date(startdt)]
tempData[1, enddt:= startdt + daysupp]

for (i in 2:nrow(tempData)) {

  if (tempData[i,startdt] >= tempData[i-1,enddt]) {
    tempData[i, enddt:= startdt + daysupp]

  } else {
    tempData[i, enddt:= tempData[i-1,enddt] + daysupp]
  }

}

这个计算应该针对不同的药物名称进行,这样我就可以创建 for loop 的函数并将其用于我的 DTgroup by 的品牌名称。这个计算需要很多时间。我想知道是否有一种方法可以使用矢量化方法顺序更新 data.table 行。

我正在考虑使用 shift,但是我找不到按照这两个 if 语句顺序更新 enddt 变量的方法。

这是一个关于如何真正快速地处理此类计算的一般性问题。

我会编写一个简单的 Rcpp 函数,而不是花时间寻找矢量化 R 解决方案:

library(Rcpp)
sourceCpp(code = "
          #include <Rcpp.h>
          // [[Rcpp::export]]
          Rcpp::IntegerVector myfun(const Rcpp::IntegerVector x, const Rcpp::IntegerVector y) {
          Rcpp::IntegerVector res = x;
          res(0) = x(0) + y(0);
          for (int i=1; i<x.length(); i++) {
            if (x(i) >= res(i-1)) res(i) += y(i);
            else res(i) = res(i-1) + y(i);
          }
          return res;
          }
          ")
tempData[, enddt1 := myfun(startdt, daysupp)]
#   drugName    startdt daysupp      enddt     enddt1
#1: Aspirine 2012-01-01      30 2012-01-31 2012-01-31
#2: Aspirine 2012-01-20      30 2012-03-01 2012-03-01
#3: Aspirine 2012-02-15      10 2012-03-11 2012-03-11
#4: Aspirine 2012-03-10      20 2012-03-31 2012-03-31

这对您的解决方案略有改动,使用 pmax 而不是 if 语句

在给定数据集上大约快 30%
library(data.table)
tempData[, startdt:= as.Date(startdt)]
tempData[1, enddt:= startdt + daysupp]

for (i in 2:nrow(tempData)) {
  tempData[i, enddt:=pmax(startdt, tempData[i-1,enddt]) + daysupp]
}