【问题标题】:R - Iteration with Reduce() [closed]R - 使用 Reduce() 进行迭代 [关闭]
【发布时间】:2021-07-04 09:24:23
【问题描述】:

我目前正在使用 for 循环来迭代计算一个名为“w_ratio”的变量,它是“ratio”的加权平均值。我的 for 循环如下所示:

  for (i in 2:(nrow(transactions)-1)) {
    if (transactions$type[i] == "Mint") {
      transactions$w_ratio[i] <- (transactions$cum_liquidity[i-1]*transactions$w_ratio[i-1] + transactions$liquidity[i]*transactions$ratio[i]) / transactions$cum_liquidity[i]
    } else {
      transactions$w_ratio[i] <- transactions$w_ratio[i-1]
    }
  }

这是一个可重现的例子:

dat <- data.frame(liquidity=c(1,2,3,4,-1,5,6,-2,7),
                  ratio=c(0.2,0.2,0.3,0.4,-0.3,0.4,0.3,-0.3,0.4),
                  type=c("Mint","Mint","Mint","Mint","Burn","Mint","Mint","Burn","Mint"))

dat$cum_liquidity <- cumsum(dat$liquidity)

dat$w_ratio <- 0
dat$w_ratio[1] <- dat$ratio[1]

for (i in 2:(nrow(dat))) {
  if (dat$type[i] == "Mint") {
    dat$w_ratio[i] <- (dat$cum_liquidity[i-1]*dat$w_ratio[i-1] + dat$liquidity[i]*dat$ratio[i]) / dat$cum_liquidity[i]
    } else {
      dat$w_ratio[i] <- dat$w_ratio[i-1]
    }
}

代码运行良好,但由于 for 循环而非常慢。由于我有几百万行,我正在寻找另一个函数,它利用矢量化来计算相同的 w_ratio 变量,而不使用 for 循环。我的想法是可能使用 Reduce() 函数,但在这种情况下我不知道如何实现它。任何帮助将不胜感激。

【问题讨论】:

  • 如果您创建一个小的可重现示例以及预期的输出,这将更容易提供帮助。阅读how to give a reproducible example
  • 感谢您的意见,我刚刚集成了一个可重现的示例。
  • 请同时包含预期结果
  • 谢谢我也介绍了预期的结果(变量w_ratio)

标签: r for-loop recursion iteration reduce


【解决方案1】:

你可以试试parallel::mclapply()

geti <- function(i, data) {
    if (data$type[i] == "Mint") {
      data$w_ratio[i] <- (data$cum_liquidity[i-1]*data$w_ratio[i-1] + data$liquidity[i]*data$ratio[i]) / data$cum_liquidity[i]
    } else {
      data$w_ratio[i] <- data$w_ratio[i-1]
    }
}
library(parallel)
rows <- 2:(nrow(dat)-1)
res <- mclapply(rows, geti, data=dat)
names(res) <- rows

$`2`
numeric(0)

$`3`
numeric(0)

$`4`
numeric(0)

$`5`
NULL

$`6`
numeric(0)

$`7`
numeric(0)

$`8`
NULL

【讨论】:

    猜你喜欢
    • 2020-08-08
    • 1970-01-01
    • 2010-09-06
    • 1970-01-01
    • 1970-01-01
    • 2016-08-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多