如果我创建了多个矩阵,如何将它们组合成一个数组?我有 8 个矩阵,每个矩阵有 200 行和 200 列,我需要将它们组合成一个 dim = 200,200,8 的数组。所以我希望我的每个矩阵都是我数组的一部分。
7 回答
您可以使用包中的abind
功能abind
:
library(abind)
newarray <- abind( mat1, mat2, mat3, mat4, along=3 )
## or if mats are in a list (a good idea)
newarray <- abind( matlist, along=3 )
这是两个的例子。您可以轻松地将其扩展到八个
# create two matricies with however many rows and columns
x <- matrix( 1:9 , 3 , 3 )
y <- matrix( 10:18 , 3 , 3 )
# look at your starting data
x
y
# store both inside an array, with the same first two dimensions,
# but now with a third dimension equal to the number of matricies
# that you are combining
z <- array( c( x , y ) , dim = c( 3 , 3 , 2 ) )
# result
z
简短的版本是您可以使用以下函数将一组矩阵简化为数组simplify2array
:
simplify2array(list(x,y))
下面是我之前的回答,展示了如何使用sapply
'simplify=
参数执行此操作,因为'simplify2array()' 是当 'simplify' 不为假时从 'sapply()' 调用的实用程序- 请参阅?sapply
帮助文件。
这是一个类似于abind
-ing 的版本,但没有使用任何额外的包。将所有内容收集到 a 中list
,然后使用sapply
' 选项到simplify=
a 中"array"
,对列表的每个部分都没有执行任何操作(identity
只返回对象并等效于function(x) x
):
sapply(list(x,y), identity, simplify="array")
# similarly to save a couple of keystrokes, the following is usually identical
sapply(list(x,y), I, simplify="array")
#, , 1
#
# [,1] [,2] [,3]
#[1,] 1 4 7
#[2,] 2 5 8
#[3,] 3 6 9
#
#, , 2
#
# [,1] [,2] [,3]
#[1,] 10 13 16
#[2,] 11 14 17
#[3,] 12 15 18
如果您想保留新数组中每个原始矩阵的名称作为标识符,请尝试:
sapply(mget(c("x","y")), identity, simplify="array")
这取决于您是否要将它们组合为列优先或行优先。这类似于使用cbind
和rbind
将向量组合成矩阵。因为 R 以列优先顺序存储矩阵,所以这是最容易完成的:
matrices <- list(
matrix( 1:9 , 3 , 3 ),
matrix( 10:18 , 3 , 3 )
);
#it is assumed all matrices in the list have equal dimensions
array1 <- array(
data = do.call(cbind, matrices),
dim = c(dim(matrices[[1]]), length(matrices))
);
新维度(在本例中为 2)将成为第 3 个维度。从 print 方法的输出来看,这看起来很准确,因为它按最后一个维度拆分了 print:
> print(array1)
, , 1
[,1] [,2] [,3]
[1,] 1 4 7
[2,] 2 5 8
[3,] 3 6 9
, , 2
[,1] [,2] [,3]
[1,] 10 13 16
[2,] 11 14 17
[3,] 12 15 18
但是,有时您可能需要将它们按第一个维度组合,例如:
array2 <- array (
data = do.call(rbind, lapply(matrices, as.vector)),
dim = c(length(matrices), dim(matrices[[1]]))
);
print(array2[1,,])
[,1] [,2] [,3]
[1,] 1 4 7
[2,] 2 5 8
[3,] 3 6 9
例如,假设您要将这些矩阵分配给具有列的数据框;每行一个矩阵。然后第一个维度,也就是nrow
必须在数组和数据框中匹配:
mydf <- data.frame(foo = 1:2, row.names=c("first", "second"))
mydf$bar <- array1
Error in `$<-.data.frame`(`*tmp*`, "bar", value = 1:18) :
replacement has 3 rows, data has 2
mydf$bar <- array2
mydf$bar
library('abind')
abind(m1, m2, m3, along = 2.5)
abind(m1, m2, m3, along = 3)
m4 <- list(m1, m2, m3)
abind(m4, along = 3)
along input = matrix + matrix output
----------------------------------------------------------------------------
0 split columns and row bind them array
0.5 same as 0 array
1 combine matrices into one matrix by rowwise matrix
1.5 split columns and column bind them array
2 combine matrices into one matrix by columnwise matrix
2.5 Form an array with matrices array
3 Same as 2.5 array
这个怎么样:
combmat <- array(dim=c(200,200,8), data=cbind(matrix1,matrix2,...,matrix8) )
到目前为止,所有解决方案的问题在于,当矩阵(不是data.frame
s - 为此dplyr
并且data.table
工作正常)没有相同的行和列顺序时,bind 会将不相关的值相互堆叠。
如果您想检查并考虑每个维度中的名称,请查看narray
:
(免责声明:我写了这个包)