2015-04-14 54 views
1

如何將大型csv文件讀入R中數組的切片? 我有500個csv文件,480行和640列包含熱成像相機的數據。我想要製作的是一個尺寸爲640 x 480 x 500的陣列,其中實際上陣列的每個切片都包含一個由熱像儀拍攝的圖片(640 x 480像素(以°C爲單位))。直到現在我把csv文件放在一個帶有for循環的矩陣列表中,然後將它們取消列表以創建一個數組。問題在於我的電腦內存很快就滿了,所以最好將數據存儲在一個數組中,但我不知道該怎麼做。無論如何,我都需要數組格式的數據來進一步計算。將數據讀入R中的數組切片

matrices<-list() 

for (i in 0:endval){ 
     filenumber<-sprintf("%03d",(i+1)) 
     matrices[[i+1]]<-read.csv2(file=paste(nameoffile,filenumber,".csv",sep=""),header=F) 
     } 

array1<-array(unlist(matrices), dim = c(nrow(matrices[[1]]), ncol(matrices[[1]]), length(matrices))) 

在此先感謝!

+0

格式化它的最好方法可能更多地取決於你將如何使用它。在大多數情況下,我可能會選擇將其存儲爲矩陣列表,但它又取決於它。 –

+0

對於大多數應用程序來說,矩陣列表可以完成這項工作,但是在某一點上,我不得不採用st.dev的意思。在z軸上,所有500張圖片的均值。我找到了一種方法來做這個數組,但不是一個矩陣列表。 是否有可能從數組中提取一個切片到矩陣?如果是這種情況,我寧願將數據放在數組中。 –

回答

1

您應該預先分配一次數組,然後在循環訪問CSV文件時填寫每個z切片。從我的測試結果來看,640x480x500雙精度陣列大約需要1.2GB,並且每個直接分配給陣列z-片的500個CSV讀取花費大約3.5分鐘。因此,就RAM的影響和計算時間而言,這是非常成功的:

X <- 640; Y <- 480; N <- 500; 
write.csv(matrix(1:(X*Y),X,Y),'pic1.csv',row.names=F); ## for testing 
system.time({ x <- array(NA_real_,c(X,Y,N)); }); ## preallocate 
## user system elapsed 
## 1.640 0.109 1.743 
object.size(x); 
## 1228800208 bytes 
e <- 2; Xv <- -((1+e):(X-e)); Yv <- -((1+e):(Y-e)); Nv <- -((1+e):(N-e)); 
x[Xv,Yv,Nv]; 
## , , 1 
## 
##  [,1] [,2] [,3] [,4] 
## [1,] NA NA NA NA 
## [2,] NA NA NA NA 
## [3,] NA NA NA NA 
## [4,] NA NA NA NA 
## 
## , , 2 
## 
##  [,1] [,2] [,3] [,4] 
## [1,] NA NA NA NA 
## [2,] NA NA NA NA 
## [3,] NA NA NA NA 
## [4,] NA NA NA NA 
## 
## , , 3 
## 
##  [,1] [,2] [,3] [,4] 
## [1,] NA NA NA NA 
## [2,] NA NA NA NA 
## [3,] NA NA NA NA 
## [4,] NA NA NA NA 
## 
## , , 4 
## 
##  [,1] [,2] [,3] [,4] 
## [1,] NA NA NA NA 
## [2,] NA NA NA NA 
## [3,] NA NA NA NA 
## [4,] NA NA NA NA 
## 
system.time({ for (i in 1:N) { fileName <- 'pic1.csv'; x[,,i] <- as.matrix(read.csv(fileName)); }; }); 
## user system elapsed 
## 207.000 0.969 208.492 
object.size(x); 
## 1228800208 bytes 
x[Xv,Yv,Nv]; 
## , , 1 
## 
##  [,1] [,2] [,3] [,4] 
## [1,] 1 641 305921 306561 
## [2,] 2 642 305922 306562 
## [3,] 639 1279 306559 307199 
## [4,] 640 1280 306560 307200 
## 
## , , 2 
## 
##  [,1] [,2] [,3] [,4] 
## [1,] 1 641 305921 306561 
## [2,] 2 642 305922 306562 
## [3,] 639 1279 306559 307199 
## [4,] 640 1280 306560 307200 
## 
## , , 3 
## 
##  [,1] [,2] [,3] [,4] 
## [1,] 1 641 305921 306561 
## [2,] 2 642 305922 306562 
## [3,] 639 1279 306559 307199 
## [4,] 640 1280 306560 307200 
## 
## , , 4 
## 
##  [,1] [,2] [,3] [,4] 
## [1,] 1 641 305921 306561 
## [2,] 2 642 305922 306562 
## [3,] 639 1279 306559 307199 
## [4,] 640 1280 306560 307200