将3D数组的每个元素连续写入文件的最有效方法是什么?

时间:2013-08-01 10:25:06

标签: arrays r output

我有一个大型3D数组,我想将其作为单个列写入文件。数据首先需要通过Z(从高到低)然后通过x(从低到高)然后通过y(从低到高)变化。目前我正在这样做:

arr <<- array(0,dim=c(x,y,z)) # values aren't really 0
dataf <- data.frame(Px=rep(0,x*y*z))
ticker <- 0
  for (j in 1:y){
    for (i in 1:x){
      for (k in z:1){
        ticker <- ticker +1
        dataf[ticker,1] <- arr[i,j,k]
        }
      }
    }
write.table(dataf,file=filename,row.names=F,col.names=F)

这个过程很慢,并且随着迭代的进展似乎变慢(用进度条看)。 我确信这是一种使用adply的方法,但我无法让它工作。我按如下方式切换了z数据的顺序:

    for (n in 1:z)
      arr_inv[,,n] <- arr[,,(z-n+1)]

然后尝试这样写:

write.table(adply(arr,.margins=c(1,2,3))[4],file=filename,row.names=F,col.names=F)

我所做的一切似乎都很快,所以我想知道你是否应该知道如何处理这个问题? 感谢

1 个答案:

答案 0 :(得分:1)

一种(错综复杂的)方法是使用lapply将数组在第三维上拆分为列表元素,然后使用mapply重新整形矩阵,最后将其转换为输出向量:

mat <- array( rep(1:9,each=3) , dim = c(3,3,3) )
mat
, , 1

     [,1] [,2] [,3]
[1,]    1    2    3
[2,]    1    2    3
[3,]    1    2    3

, , 2

     [,1] [,2] [,3]
[1,]    4    5    6
[2,]    4    5    6
[3,]    4    5    6

, , 3

     [,1] [,2] [,3]
[1,]    7    8    9
[2,]    7    8    9
[3,]    7    8    9


as.vector( t( mapply( c , lapply( 1:3 , function(x) as.vector( t(mat[,,x]) ) ) ) ) )
[1] 1 4 7 2 5 8 3 6 9 1 4 7 2 5 8 3 6 9 1 4 7 2 5 8 3 6 9

作为一方,请在下次包含可重现的示例