简体   繁体   English

用R中的sapply替换嵌套的for循环

[英]replacing nested for loop with sapply in R

So I have 10 parameters, with 7 fixed and 3 varying using seq . 所以我有10个参数,其中7个是固定的,而3个是使用seq变化的。 Each varying parameter has 10 possibilities. 每个变化的参数都有10种可能性。 Right now I create an empty data frame and fill it after going through a bunch of functions and generating an output for each combination of parameters. 现在,我创建一个空的数据框,并在完成一堆函数并为每种参数组合生成输出之后填充它。 So there is 1000 (10*10*10) possibilities. 因此有1000(10 * 10 * 10)个可能性。 Right now I use nested for loops. 现在,我使用嵌套的循环。 Lets say m,g, and x are my varying parameters. 假设m,g和x是我的各种参数。 Here is an example. 这是一个例子。

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)  

What I have works but seems pretty inefficient so I have been trying to find how to use sapply or lapply but have not been successful in understanding to use them so all the combos. 我的工作原理不错,但效率似乎很低,因此我一直试图找到如何使用sapply或lapply的方法,但未能成功理解如何使用它们,因此无法使用所有组合。 are made. 被制造。 Any help is appreciated. 任何帮助表示赞赏。

You seem to have lost mm in your data, so I can not follow perfectly, but a better way to do this would be to vectorize: 您似乎在数据中丢失了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)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM