我有一个大型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)
我所做的一切似乎都很快,所以我想知道你是否应该知道如何处理这个问题? 感谢
答案 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
作为一方,请在下次包含可重现的示例