gpt4 book ai didi

r - 按顺序更新 data.table 中的行

转载 作者:行者123 更新时间:2023-12-02 04:02:10 27 4
gpt4 key购买 nike

我有一个非常大的数据集,我想使用 data.table 在 R 中执行以下计算:

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 循环 函数,并将其与 group by< 一起使用到我的 DT 品牌名称。这个计算需要很多时间。我想知道是否有一种方法可以使用矢量化方法顺序更新 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

关于r - 按顺序更新 data.table 中的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41363526/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com