【问题标题】:apply does not result in the same vector like replaced for-loopapply 不会像替换的 for 循环那样产生相同的向量
【发布时间】:2017-08-14 16:17:11
【问题描述】:

函数“trio”举例说明了一个具有大量计算的函数,它从数据框 (df) 中获取某些列和三个值进行计算:

# example: data
df <- data.frame(C1= c(1,2,3,4,5,6),C2= c(5,4,3,2,1,6),C3= c(9,1,5,2,7,4))

# example: function
trio  <- function(a,b,c){
             df2 <- df %>%
             mutate(., 
                 df$C1 * a,
                 df$C2 * b,
                 df$C2 * c 
              ) 
df2$calc <- df2[3] * df2[4]/df2[5]
max(df2$calc)
}

要找出哪个值组合产生最佳输出(= max(df2$calc),创建一个具有值组合的矩阵:

pp <- expand.grid(parameter_A = round(seq(min, max, length.out = count),3),
                  parameter_B = round(seq(min, max, length.out = count),3), 
                  parameter_C = round(seq(min, max, length.out = count),3))

替换for循环

max.all<- c()
for(w in 1:nrow(pp)){
    max.all[w] <-  findWinZ(pp[w,1],pp[w,2],pp[w,3])  
    }

我的目标是使用 Apply-Family 的一项功能(sapply、lapply),例如

Version1: res2 <- sapply(pp, function(a,b,c)  findWinZ(length(pp[,1]),length(pp[,2]),length(pp[,3])))  

Version: res3 <- sapply(pp, function(a,b,c)  length(findWinZ(pp[w,1],pp[w,2],pp[w,3])))  

唉,apply() 循环的结果是错误的。我需要的是具有所有结果的向量,即与我从 for 循环获得的输出相同。 请问,谁能更正我的 apply() 代码?非常感谢!

【问题讨论】:

  • 看起来你想要遍历一系列的多个参数。我想你想在这种情况下使用mapply。
  • 是的mapply 似乎适合在这里使用apply-family 函数。请更加注意使您的示例在未来可重现。
  • 将测试此选项并比较性能。感谢您的建议!

标签: r for-loop apply lapply sapply


【解决方案1】:

如果问题是如何将 for 循环重写为 sapply,那么:

res4 <- sapply(1:nrow(pp), function(w) findWinZ(pp[w,1],pp[w,2],pp[w,3]))

【讨论】:

  • 谢谢!解决方案非常简单。至少,我接近了。有趣的是,apply() 版本并不比 for 循环快多少(使用 ptm
猜你喜欢
  • 2019-03-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多