2013-10-22 44 views
1

我在.CSV fromat中有一個大的數據集200行和5列。 這裏是數據集的一部分:將索引分配給r中的for循環內的一個矩陣

4.1 1.2 47.3 10954 51 
3.4 1.5 0.5 1 5316 
0.3 30.1 1.2 10 875 
0.2 0.4 119 0 0 
    0 52.6 0.1 0 3.1 
    0 0.3 880 0 0 
    0 0.1 148 180 0 
    0 0.1 490.2 0 0.4 
    0 1.1 0.2 0.6 0.9 
    0 0 0 0 0 

我想用for循環寫代碼,以分別讀取每個10行和(5 10)將它存儲在一個矩陣。所以最後我有20個矩陣(10 * 5)。這是命令行:

all.data <- read.csv("C:\\Users\\Desktop\\myarray.csv",header=FALSE)#read whole data 
for (k in 1:20){ 
data_temp.k <- array(NA, dim=c(10,5)) 
    for(i in 1:10){ 
    for(j in 1:5) { 
     data_temp.k[i,j] <- all.data[(k-1)*10:k*10,j] 
    } 
    } 
} 
write.csv(data_temp.k,"mymatrix.k") 

我知道這個問題在某種程度上與「k」及其雙重功能在這裏作爲矩陣索引和計數器相關。

回答

4

不要使用循環對於這一點,使用行索引:

## Sample data 
set.seed(1) 
m <- matrix(rnorm(1000),nrow=200,ncol=5) 
## Generate indices to keep 
indices <- seq(1,nrow(m), by=10) 
## Subset matrix rows 
m[indices,] 
+0

我喜歡你的答案,但正如我所提到的,我需要爲每個矩陣考慮索引號。所以最後我可以有m.1,m.2,...,m.20這些矩陣中的每一個存儲原始矩陣的一個塊。 – SaZa

0

如果,但是,你堅持使用for循環,您可以-AT最不使用唯一的一個,不是三個嵌套循環。

您不需要j,因爲您要保留每個矩陣中的所有列。例如。 mat[1,]選擇所有列和第1行;你不需要mat[1,1:ncol(mat)]

此外,您使用i的方式是不必要的,因爲您的子集多於一行(使用k-1 * 10等)每次都會傳遞到第i行。

最後,如果您嘗試保存20個矩陣中的每一個,則可能需要paste

這應該工作(未測試):

for(k in 1:20) 
{ 
    data_temp.k <- all.data[((k-1)*10):(k*10),] 

    write.csv(data_temp.k, paste("mymatrix", k, sep = ".") 
} 
2

這可能不會增加太多的除了是你如何使用array S和aperm到mtrix分割成塊,並重塑一個很好的示範,全部使用base R向量化函數。您始終可以使用apply將函數應用於數組的每個維度。

# Sample data 
m <- matrix(1:16 , 4 , 4) 
#  [,1] [,2] [,3] [,4] 
#[1,] 1 5 9 13 
#[2,] 2 6 10 14 
#[3,] 3 7 11 15 
#[4,] 4 8 12 16 

# Use array() to turn into arrays and aperm() to transpose the 3D array t0 the result you expect 
out <- aperm(array(t(m) , c(4,2,2)) , c(2,1,3)) 
#, , 1 
#  [,1] [,2] [,3] [,4] 
#[1,] 1 5 9 13 
#[2,] 2 6 10 14 

#, , 2 
#  [,1] [,2] [,3] [,4] 
#[1,] 3 7 11 15 
#[2,] 4 8 12 16 

您可以在第三維上應用函數,例如,使用'apply'

# Sum all the elements in each of the third dimension of your arrays 
apply(out , 3 , sum) 
#[1] 60 76 
+0

這很酷,但在一天結束時,我想要以這種格式使用20個不同的矩陣:Out.1,Out.2,...,Out.3具有不同的索引,每個索引都是一個塊原始矩陣。 – SaZa

+0

@ user2607526我不得不問...... *爲什麼*?幾乎總是最好有20個矩陣駐留在一個列表(或一個數組)中,您可以相當自由地操作(一旦你知道如何操作),而不是用20個對象混淆工作空間。你想和他們做什麼*? –

+0

@ SimonO101;我想用另一個for循環來讀取它們並將它們轉換爲netcdf格式。這就是爲什麼我需要他們有索引,然後我可以在另一個for循環回憶他們。你知道更好的方法來回憶它們嗎? – SaZa