gpt4 book ai didi

r - 我可以避免向量中的操作的 for 循环吗?

转载 作者:行者123 更新时间:2023-12-04 09:36:50 25 4
gpt4 key购买 nike

有没有办法在没有 for 循环的情况下计算数据表中的第 4 列(超时)?该列的每个第 i 行都使用第 i-1 行,因此随着行数的增加,生成需要大量时间。

library(data.table)
dt <- data.table(
id = 1:200,
timein = cumsum(runif(200,1,6)),
servtime = runif(200,3,4))

dt[,"timeout"] <- dt$timein # initialisation of timeout column

# update column timeout
for(i in 2:200) {
dt$timeout[i] <- max(dt$timein[i], dt$timeout[i-1]) + dt$servtime[i]
}

最佳答案

我在基础 R 中没有看到使用矢量化运算符来加速这一过程的简单方法,但您可以使用 Rcpp 来加速操作:

library(Rcpp)
get.timeout <- cppFunction("
NumericVector getTimeout(NumericVector timein, NumericVector servtime) {
const int n = timein.size();
NumericVector timeout(n);
timeout[0] = timein[0];
for (int i=1; i < n; ++i) {
timeout[i] = fmax(timein[i], timeout[i-1]) + servtime[i];
}
return timeout;
}")

这比使用 for 循环的解决方案更快:
for.loop <- function(timein, servtime) {
timeout <- dt$timein
n <- length(timeout)
for(i in 2:n) {
timeout[i] <- max(timein[i], timeout[i-1]) + servtime[i]
}
return(timeout)
}
all.equal(for.loop(dt$timein, dt$servtime), get.timeout(dt$timein, dt$servtime))
# [1] TRUE
library(microbenchmark)
microbenchmark(for.loop(dt$timein, dt$servtime), get.timeout(dt$timein, dt$servtime))
# Unit: microseconds
# expr min lq mean median uq max neval
# for.loop(dt$timein, dt$servtime) 414.040 429.5315 438.68765 435.4000 445.1185 506.162 100
# get.timeout(dt$timein, dt$servtime) 22.432 23.9305 28.54934 27.9135 28.6670 97.259 100

对于较大的输入,优势可能会增加。

关于r - 我可以避免向量中的操作的 for 循环吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29151544/

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