【问题标题】:applying user defined function without for loop在没有 for 循环的情况下应用用户定义的函数
【发布时间】:2020-06-01 00:40:31
【问题描述】:

我正在尝试使用自定义函数来解决参数的多个排列。

该函数 (yield.n) 在我调用一次时可以正常工作,例如: 产量.n(naa, F, M, S, Y) naa 是一个大型数据框 (750000 x 17),F、M 和 Y 是数字对象,S 是向量。

我想用这个函数解决 Y 的各种值。我尝试了 apply 系列的多种排列,但我无法提出函数代码。 如果我对 Y 的值(代码崩溃)运行 for 循环,它可以正确解决,但速度很慢。

yn.out <- NULL                                        
    for(yr in 50:150){                               
           yr.out <- yield.n(naa, ssf, M, S, yr)         
           yr.out <- cbind(yr.out, yr)                       
           yn.out <- rbind(yn.out, yr.out)
        }

yn.out <- as.data.frame(yn.out)

我如何获得一个应用函数来解决这个问题以解决 Y 的多个值?

该函数的代码如下(但我不确定这与手头的问题是否相关)。

function(naa, F, M, S, Y){
    yr <- Y
    naa.lci <- aggregate(naa[, 1:16], list(naa$year),
                         "quantile", probs = .05)
    naa.m   <-  aggregate(naa[, 1:16], list(naa$year),
                          "quantile", probs = .5)
    naa.uci <- aggregate(naa[, 1:16], list(naa$year),
                         "quantile", probs = .9)
    yield.n.lci <- round(sum(((F*S)/(M + (F*S))) * (1- exp(-M-(F*S))) *
                             naa.lci[yr, 2:17]))
    yield.n.m   <- round(sum(((F*S)/(M + (F*S))) * (1- exp(-M-(F*S))) *
                             naa.m[yr, 2:17]))
    yield.n.uci <- round(sum(((F*S)/(M + (F*S))) * (1- exp(-M-(F*S))) *
                             naa.uci[yr, 2:17]))
    yield.out <- cbind(yield.n.lci, yield.n.m, yield.n.uci)
    return(yield.out)
}

【问题讨论】:

    标签: r apply user-defined-functions


    【解决方案1】:

    尝试以下方法:

    yn.out <- do.call(rbind, lapply(50:150, function(y) 
                      cbind(yield.n(naa, F, M, S, y), yr = y)))
    

    或使用purrr::map_df

    yn.out <- purrr::map_df(50:150, ~cbind(yield.n(naa, F, M, S, .x), yr = .x))
    

    【讨论】:

      猜你喜欢
      • 2019-10-10
      • 1970-01-01
      • 1970-01-01
      • 2021-11-18
      • 1970-01-01
      • 1970-01-01
      • 2020-07-23
      • 2014-05-26
      • 2018-12-11
      相关资源
      最近更新 更多