2015-07-10 75 views
0

所以我有10個參數,7固定和3變化seq。每個可變參數有10種可能性。現在我創建一個空的數據框並在經過一堆函數併爲每個參數組合生成一個輸出後填充它。所以有1000個(10 * 10 * 10)的可能性。現在我使用嵌套for循環。可以說,m,g和x是我變化的參數。這是一個例子。取代嵌套for循環與藍寶石在R

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使用,但並沒有成功地瞭解使用它們,因此所有的連擊。製成。任何幫助表示讚賞。

+1

請提供*工作*例子。聽起來像你只需要'expand.grid(mm,gg,xx)' – rawr

+0

編輯應該提供額外的細節。 – adaml768

回答

2

你似乎已經失去了你的數據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) 
+0

這似乎工作。我也想改變mm。這是m.c和m.i,我想這樣做很好。謝謝! – adaml768