使矩阵在绑定R中组合相等

  • 本文关键字:组合 绑定 arrays matrix
  • 更新时间 :
  • 英文 :


我相信这里有人问过类似的问题,但我似乎找不到它了。

我有两个不同维数的矩阵,我想使它们相等,这样我就可以把它们组合成一个数组。

例如

,我有以下两个矩阵:

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扩展小矩阵,我们可以使用一个简单的方法,如:

  1. 创建一个和b一样大的矩阵,只有NA。代码:

    extended.a = matrix(NA,nrow(b),ncol(b))

  2. 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

最新更新