我相信这里有人问过类似的问题,但我似乎找不到它了。
我有两个不同维数的矩阵,我想使它们相等,这样我就可以把它们组合成一个数组。
例如,我有以下两个矩阵:
a <- matrix(1:6, 3, 2)
b <- matrix(1:12, 4, 3)
a
[,1] [,2]
[1,] 1 4
[2,] 2 5
[3,] 3 6
b
[,1] [,2] [,3]
[1,] 1 5 9
[2,] 2 6 10
[3,] 3 7 11
[4,] 4 8 12
因为我正在处理时间序列数据,我希望添加的行/列在其中具有NAs。在我的示例中,矩阵a将获得一个额外的列和一个额外的行,只包含像这样的NAs:
[,1] [,2] [,3]
[1,] 1 4 NA
[2,] 2 5 NA
[3,] 3 6 NA
[4,] NA NA NA
在我的数据集中,我将有79个不相等维数的矩阵,我需要使它们与最大维数的矩阵一样大
如果b
是最大的矩阵,则可以创建一个与b
相同维数的矩阵,用NA
填充,并将较小的矩阵a
对应的行和列替换为a
的值:
a2 <- "[<-"(x = matrix(NA, nrow = nrow(b), ncol = ncol(b)),
i = 1:nrow(a), j = 1:ncol(a),
value = a)
a2
# [,1] [,2] [,3]
# [1,] 1 4 NA
# [2,] 2 5 NA
# [3,] 3 6 NA
# [4,] NA NA NA
有几个矩阵的例子,其中我们找到最大的矩阵,并用NA
填充所有矩阵以匹配最大矩阵的维数。
# create some matrices of different size
a <- matrix(1:6, nrow = 3, ncol = 2)
b <- matrix(1:12, nrow = 4, ncol = 3)
c <- matrix(1:4, nrow = 2, ncol = 2)
# put them in a list
l <- list(a, b, c)
# index of largest (here, max number of rows) matrix in the list
id <- which.max(unlist((lapply(l, nrow))))
# pad matrices with NA
l2 <- lapply(l, function(x){
x <- "[<-"(x = matrix(NA, nrow = nrow(l[[id]]), ncol = ncol(l[[id]])),
i = 1:nrow(x), j = 1:ncol(x),
value = x)
})
l2
# [[1]]
# [,1] [,2] [,3]
# [1,] 1 4 NA
# [2,] 2 5 NA
# [3,] 3 6 NA
# [4,] NA NA NA
#
# [[2]]
# [,1] [,2] [,3]
# [1,] 1 5 9
# [2,] 2 6 10
# [3,] 3 7 11
# [4,] 4 8 12
#
# [[3]]
# [,1] [,2] [,3]
# [1,] 1 3 NA
# [2,] 2 4 NA
# [3,] NA NA NA
# [4,] NA NA NA
由于您只想用NA
扩展小矩阵,我们可以使用一个简单的方法,如:
-
创建一个和
b
一样大的矩阵,只有NA
。代码:extended.a = matrix(NA,nrow(b),ncol(b))
-
用
a
中的值填充这个矩阵。代码:extended.a[cbind(rep(1:nrow(a),ncol(a)), rep(1:ncol(a),each=nrow(a)))] = a
根据Roland的建议,你也可以用which(..., arr.ind=TRUE)
得到索引向量。
例如:which(TRUE | a, arr.ind=TRUE)
甚至:which(matrix(TRUE,nrow(a),ncol(a), arr.ind=TRUE)
或者使用expand.grid
函数更好:expand.grid(1:nrow(a), 1:ncol(a))
也许我们可以尝试以下基本R选项
> replace(NA + b, cbind(c(row(a)), c(col(a))), a)
[,1] [,2] [,3]
[1,] 1 4 NA
[2,] 2 5 NA
[3,] 3 6 NA
[4,] NA NA NA