假设我有:
aa <- seq(2,10, length=3)
bb <- seq(20,30, length=2)
cc <- seq(10,11, length=2)
fun <- function(a,b,c) {return(a+b-c)}
out <- array(dim=c(length(aa), length(bb), length(cc)))
for(i in 1:length(aa)) {
for(j in 1:length(bb)) {
for(k in 1:length(cc)) {
out[i,j,k] <- fun(aa[i], bb[j], cc[k])
}
}
}
为了更快的替代方案,我接着尝试了apply()如下
b2 <- rep(bb, each=2)
abc <- rbind(rep(aa, each=2*2), rep(bb, each=2), rep(cc,6))
out2 <- apply(abc, 2, function(x){ fun(x[1], x[2], x[3]) } )
这基本上和以前一样计算,但我不能得到&#34; out2&#34;在数组中作为&#34; out&#34;。你能纠正下面的代码,以便out和out2完全一样吗?非常感谢提前
out2 <- array(out2, dim=dim(out))
答案 0 :(得分:2)
不确定是否有办法在一个步骤中完成它,但这里还有两个步骤:
#your original code
b2 <- rep(bb, each=2)
abc <- rbind(rep(aa, each=2*2), rep(bb, each=2), rep(cc,6))
out2 <- apply(abc, 2, function(x){ fun(x[1], x[2], x[3])})
out2 = matrix(out2,ncol=4,nrow=3,byrow=T)
out2 = array(c(out2[,c(1,3)],out2[,c(2,4)]),dim=dim(out))
identical(out,out2)
#[1] TRUE
答案 1 :(得分:2)
虽然不是非常灵活,但您可以重新排列整个问题,如:
outer(outer(aa,bb,"+"),cc,"-")
identical(out,outer(outer(aa,bb,"+"),cc,"-"))
#[1] TRUE