gpt4 book ai didi

r - 加速/替代引用先前计算行的 for 循环

转载 作者:行者123 更新时间:2023-12-03 22:59:40 31 4
gpt4 key购买 nike

我有一些代码需要构建一个列,该列查看前一行并求和,直到达到某个点,该点返回到 0 并再次开始。
目前这是通过 for 循环完成的,但是我想用它来处理的数据集之一是 300 万行,用这种方法处理需要几天时间。为了用于我的目的,它需要在几秒钟内处理。
有没有办法加快或替换 for 循环,以便可以更快地处理?
( lag() 等不能使用,因为它们使用的是预先计算的数据)

DD <- c("Yes", "No", "No", "Yes", "No", "No", "No", "No", "No", "No", "Yes", "Yes", "Yes", "Yes", "Yes", "Yes", "No", "Yes", "Yes", "Yes", "Yes", "Yes", "No", "No", "No")

dataOut <- data.frame(DD)

alarm.upper.limit <- 7.26
alarm.lower.limit <- -7.26

s <- 0.11

dataOut$weight <- if_else(dataOut$DD=="Yes", 1-s, 0-s)

dataOut$cusum[1] <- dataOut$weight[1]

for (j in 2:nrow(dataOut)) {
dataOut$cusum[j] <- if(dataOut$cusum[j-1]<alarm.lower.limit){dataOut$cusum[j]=0}
else if(dataOut$cusum[j-1]>alarm.upper.limit){dataOut$cusum[j]=0}
else{(dataOut$weight[j])+(dataOut$cusum[j-1])}
}


最佳答案

我们可以使用 accumulate它应该比 for 快循环操作

library(dplyr)
library(purrr)
dataOut %>%
mutate(cusum2 = accumulate(weight, ~
if(between(.x, alarm.lower.limit, alarm.upper.limit)) .x + .y else 0))

或使用 Reducebase R
dataOut$cusum3 <- with(dataOut, Reduce(function(x, y)
if(x >= alarm.lower.limit & x <= alarm.upper.limit) x + y
else 0, weight, accumulate = TRUE))

在稍微大一点的数据上
dataOut1 <- dataOut[rep(seq_len(nrow(dataOut)), 1e3), ]


system.time({
dataOut1$cusum[1] <- dataOut1$weight[1]

for (j in 2:nrow(dataOut1)) {
dataOut1$cusum[j] <- if(dataOut1$cusum[j-1]<alarm.lower.limit){
dataOut1$cusum[j]=0}
else if(dataOut1$cusum[j-1]>alarm.upper.limit){
dataOut1$cusum[j]=0}
else{
(dataOut1$weight[j])+(dataOut1$cusum[j-1])}
}

})
# user system elapsed
# 0.902 0.758 1.617

system.time({
dataOut1 <- dataOut1 %>%
mutate(cusum2 = accumulate(weight,
~ if(between(.x, alarm.lower.limit, alarm.upper.limit)) .x + .y else 0))

})

#user system elapsed
# 0.110 0.005 0.116

关于r - 加速/替代引用先前计算行的 for 循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67066194/

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