在 R 中用 sapply 替换嵌套的 for 循环
replacing nested for loop with sapply in R
所以我有 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,但未能成功地理解如何使用它们以及所有组合。被制成。任何帮助表示赞赏。
您的数据似乎丢失了 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)
所以我有 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,但未能成功地理解如何使用它们以及所有组合。被制成。任何帮助表示赞赏。
您的数据似乎丢失了 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)