【发布时间】:2013-08-02 05:17:50
【问题描述】:
我有一个大型 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)
我所做的一切似乎都不是很快,所以我想知道你是否知道我应该如何处理这个问题? 谢谢
【问题讨论】:
-
只需
melt它使用 reshape2 然后像往常一样使用write.table导出生成的data.frame -
您的
ticker计数不应该从 1 开始,而不是 0 吗? -
谢谢,这是另一种方式,但仍然很慢。写一个 50kb 的文件大约需要 20 秒...
-
Hong,是的,我在这个例子中把它放在了错误的行,现在修复。谢谢