R中的apply()输出数组

时间:2014-05-09 01:45:34

标签: arrays r

假设我有:

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))

2 个答案:

答案 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