【问题标题】:replacing nested for loop with sapply in R在 R 中用 sapply 替换嵌套的 for 循环
【发布时间】:2015-07-10 19:32:09
【问题描述】:

所以我有 10 个参数,其中 7 个是固定的,3 个是使用 seq 变化的。每个变化的参数有 10 种可能性。现在,我创建了一个空数据框,并在通过一堆函数并为每个参数组合生成输出后填充它。所以有 1000 (10*10*10) 种可能性。现在我使用嵌套的 for 循环。假设 m、g 和 x 是我的可变参数。这是一个例子。

m.c <- seq(1,10, by=1)  
m.i <- seq(1,10, by=1) * 0.5
a <-  .5 
b <-  1
c <-  .5
gg <-  seq(.02,.2, by=.02)
n <-  7
r <-  .25
alpha <-  2
dt <-  1
X <-  seq(.01,.1, by=.01)
intervention.data <-  data.frame(intervention = numeric())
parameter.data <-  data.frame(m=numeric(), g=numeric(), X=numeric())

A.c = function(m = m.c,a,b,c,g,n,r,alpha,dt,X) { 
    1 - exp(-dt*(1/(alpha*dt)*log(1+(alpha*b*dt*m*a^2*c*X*exp(-g*n))/(a*c*X+g))))
}

A.i = function(m = m.i,a,b,c,g,n,r,alpha,dt,X) { 
    1 - exp(-dt*(1/(alpha*dt)*log(1+(alpha*b*dt*m*a^2*c*X*exp(-g*n))/(a*c*X+g))))
}

for (i in 1:length(mm)) {
  m = mm[i]

  for (ii in 1:length(gg)) {
    g = gg[ii]

    for (iii in 1:length(XX)) { 
      X = XX[iii]

      parameter.data = rbind(parameter.data, data.frame(m=m, g=g, X=X))

      a.c = A.c(m = m.c,a,b,c,g,n,r,alpha,dt,X)
      a.i = A.i(m = m.i,a,b,c,g,n,r,alpha,dt,X)

      intervention.effect= a.i/a.c

      intervention.data = rbind(intervention.data, data.frame( intervention = intervention.effect))
    }
  }
}

all.intervention.data = cbind(parameter.data, intervention.data)  

我有什么工作,但似乎效率很低,所以我一直在尝试找到如何使用 sapply 或 lapply 但未能成功理解如何使用它们所有的组合。被制作。任何帮助表示赞赏。

【问题讨论】:

  • 请提供一个工作示例。听起来你反正只需要expand.grid(mm, gg, xx)
  • 编辑应该提供额外的细节。

标签: r sapply seq


【解决方案1】:

您的数据中似乎丢失了mm,所以我无法完全遵循,但更好的方法是矢量化:

all.data <- expand.grid(m.c = m.c,gg = gg,X = X)
all.data$m.i <- all.data$m.c * 0.5

all.data$a.c <- A.c(m = all.data$m.c,a,b,c,all.data$gg,n,r,alpha,dt,all.data$X)
all.data$a.i <- A.i(m = all.data$m.i,a,b,c,all.data$gg,n,r,alpha,dt,all.data$X)

【讨论】:

  • 这似乎有效。我也打算改变毫米。我想要的是 m.c 和 m.i,所以效果很好。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-08-09
  • 1970-01-01
  • 2020-06-03
  • 2018-05-21
  • 1970-01-01
  • 2019-06-06
  • 2016-07-14
相关资源
最近更新 更多