2013-10-22 43 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