我在.CSV fromat中有一个200行和5列的大数据集。 这是数据集的一部分:
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
我想编写一个代码来分别读取每10行并使用for循环将其存储在矩阵(10乘5)中。所以最后我每个都有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”有关,它的双重功能在这里作为矩阵索引和计数器。
答案 0 :(得分: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,]
答案 1 :(得分:2)
除了可以使用array
和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
答案 2 :(得分:0)
但是,如果您坚持使用for
循环,则可以 - 至少 - 仅使用一个而不是三个嵌套循环。
您不需要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 = ".")
}