假设我有一个三维维数组(x,y,z),并希望将我的数据重构为维数矩阵(x*y,z),如下所示:
my_array <- array(1:600, dim=c(10,5,12))
my_matrix<-data.frame()
for (j in 1:5) {
for (i in 1:10) {
my_matrix <- rbind (my_matrix, my_array[i,j,1:12])
}
}你能推荐一种更快更优雅的方式吗?
谢谢
发布于 2016-06-07 00:28:26
我们可以通过调用matrix并指定维度来转换为matrix
res <- matrix(my_array, prod(dim(my_array)[1:2]), dim(my_array)[3])
all.equal(as.matrix(my_matrix), res, check.attributes=FALSE)
#[1] TRUE注意:这不会改变原来的my_array`。而且,实际上代码可以简化为
matrix(my_array, 10*5, 12)并使其紧凑。
nchar("matrix(my_array, 10*5, 12)")
#[1] 26
nchar("dim(my_array) <- c(10 * 5 , 12)")
#[1] 31发布于 2016-06-07 00:32:07
更改数组的维数:
dim(my_array) <- c(10 * 5 , 12)发布于 2017-02-11 23:45:16
@akrun和@Lars Arne Jordanger的解决方案都有效,并生成相同的结果。
这两种解决方案的工作原理是:
(1)将所有矩阵的第一行连接在一起,并将这些行放在组合矩阵的顶部;然后
(2)将所有矩阵的第二行连接在一起,并将这些行置于第一行的连接下,依此类推。
下面的例子很好地说明了这个想法:
> threeDimArray <- array( NA, dim=c(3,3,4) )
> dims <- dim( threeDimArray )
>
> constants <- c(1, 10, 100)
> for( id in 1:length(constants) ){
const <- constants[id]
threeDimArray[id,,] <- matrix( (1:prod(dims[2:3]))*const, dims[2], dims[3] )
}
> threeDimArray[1,,]
[,1] [,2] [,3] [,4]
[1,] 1 4 7 10
[2,] 2 5 8 11
[3,] 3 6 9 12
> threeDimArray[2,,]
[,1] [,2] [,3] [,4]
[1,] 10 40 70 100
[2,] 20 50 80 110
[3,] 30 60 90 120
> threeDimArray[3,,]
[,1] [,2] [,3] [,4]
[1,] 100 400 700 1000
[2,] 200 500 800 1100
[3,] 300 600 900 1200
> # solution 1:
> twoDimMat <- matrix(threeDimArray, prod(dims[1:2]), dims[3])
> twoDimMat
[,1] [,2] [,3] [,4]
[1,] 1 4 7 10
[2,] 10 40 70 100
[3,] 100 400 700 1000
[4,] 2 5 8 11
[5,] 20 50 80 110
[6,] 200 500 800 1100
[7,] 3 6 9 12
[8,] 30 60 90 120
[9,] 300 600 900 1200
>
> # solution 2:
> threeDArray <- threeDimArray
> dim(threeDArray) <- c(prod( dims[1:2] ), dims[3])
> threeDArray
[,1] [,2] [,3] [,4]
[1,] 1 4 7 10
[2,] 10 40 70 100
[3,] 100 400 700 1000
[4,] 2 5 8 11
[5,] 20 50 80 110
[6,] 200 500 800 1100
[7,] 3 6 9 12
[8,] 30 60 90 120
[9,] 300 600 900 1200
> https://stackoverflow.com/questions/37662433
复制相似问题