gpt4 book ai didi

R 使用先前的迭代值对 FOR 循环进行矢量化

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

是否可以矢量化/加速使用先前迭代值的 FOR 循环的执行?

在下面的生殖示例中:

  • 当前产量是根据当前库存计算的
  • 当前生产更新NEXT股票
  • 下一次迭代使用更新的库存来确定当前的产量等...

  • 所以我需要在每次迭代时计算库存,以计算生产设定点......是否有可能避免(慢) for 循环?

    对于 50k 行,当前的实现需要大约 45 秒。
    # Dummy functions for the examples. Real code is more complicated
    function1 <- function(energy, stock, critical) {
    if (stock < critical) {
    return (energy)
    } else {
    return(0)
    }
    }
    function2 <- function(power) {
    return(round(power/100))
    }
    # Dummy data
    d <- data.frame( "energy"= c(660, 660, 660, 660),
    "stock" = c(20, 0, 0, 0),
    "delivery" = c(0, 0, 2, 0),
    "critical" = c(50, 50 ,50, 50),
    "power" = c(0, 0, 0, 0),
    "production" = c(0, 0, 0, 0) )

    for (i in 1:length(d$energy)) {

    # Computing power, based on CUURENT stock
    d$power[i] <- function1(d$energy[i], d$stock[i], d$critical[i])

    # Computing production
    d$production[i] <- function2(d$power[i])

    # Updating NEXT stock with current production / delivery
    if (i < length(d$energy)) {
    d$stock[i+1] <- d$stock[i] + d$production[i] - d$delivery[i]
    }
    }

    View(d)

    最佳答案

    一种可能性是使用 dplyr包裹是 tidyverse 的一部分.

    library(dplyr)

    d %>%
    mutate(power = function1(energy, stock, critical),
    production = function2(power),
    stock_new = cumsum(stock + lag(production - delivery, 1, default = 0)))

    energy stock delivery critical power production stock_new
    1 660 20 0 10 500 5 20
    2 660 0 0 10 500 5 25
    3 660 0 2 10 500 5 30
    4 660 0 0 10 500 5 33

    如果函数 function1,这很容易工作和 function2被矢量化。如果没有,您将不得不使用 purrr::mapmutate .

    关于R 使用先前的迭代值对 FOR 循环进行矢量化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58747098/

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