R 使一个矩阵符合另一个矩阵的维数

R 使一个矩阵符合另一个矩阵的维数,r,R,我想把两个矩阵相加,但它们的维数不同 我有一个较大的矩阵,包含所有可能的行和列: > m1 <- cbind(a=c(x=1, y=2, z=3, w=4), b=c(5:8), c=c(9:6), d=c(5:2)) ; m1 a b c d x 1 5 9 5 y 2 6 8 4 z 3 7 7 3 w 4 8 6 2 这样我就可以做这样的事情: > m1 + m3 a b c d x NA NA NA NA y NA 11 10 NA z NA 14 1

我想把两个矩阵相加,但它们的维数不同

我有一个较大的矩阵,包含所有可能的行和列:

> m1 <- cbind(a=c(x=1, y=2, z=3, w=4), b=c(5:8), c=c(9:6), d=c(5:2)) ; m1
  a b c d
x 1 5 9 5
y 2 6 8 4
z 3 7 7 3
w 4 8 6 2
这样我就可以做这样的事情:

> m1 + m3
   a  b  c  d
x NA NA NA NA
y NA 11 10 NA
z NA 14 13 NA
w NA NA NA NA

调整Richard的答案:

mmconform <- function(smaller, larger) { 
  result <- unname(smaller)[match(rownames(larger), rownames(smaller)),
                            match(colnames(larger), colnames(smaller))]
  dimnames(result) <- dimnames(larger)
  result
}

mmconform您还可以对属性使用
match
。当找不到名称时,这将返回NA,从而插入所需的NA行和列

> foo <- function(x, y) {
      mat1 <- match(colnames(x), colnames(y))
      mat2 <- match(rownames(x), rownames(y))
      unname(y)[mat1, mat2]
  }
> m1 + foo(m1, m2)
#    a  b  c  d
# x NA NA NA NA
# y NA 11 10 NA
# z NA 14 13 NA
# w NA NA NA NA
> m3 + foo(m3, m1)
#    a  b  c  d
# x NA NA NA NA
# y NA 11 10 NA
# z NA 14 13 NA
# w NA NA NA NA

>foo这很好,当我尝试执行
m2[rownames(m1),colnames(m1)]
时,绕过了
下标越界
错误。此外,我认为其中一个主要问题是
命名
。将矩阵添加到
foo
的结果时,将添加名称。否则,它们会很难看,并且有
名称。
mmconform <- function(smaller, larger) { 
  result <- unname(smaller)[match(rownames(larger), rownames(smaller)),
                            match(colnames(larger), colnames(smaller))]
  dimnames(result) <- dimnames(larger)
  result
}
aaconform <- function(smaller, larger) {
  result <- unname(smaller)[match(dimnames(larger)[[1]], dimnames(smaller)[[1]]),
                            match(dimnames(larger)[[2]], dimnames(smaller)[[2]]),
                            match(dimnames(larger)[[3]], dimnames(smaller)[[3]])]
  dimnames(result) <- dimnames(larger)
  result  
}
> foo <- function(x, y) {
      mat1 <- match(colnames(x), colnames(y))
      mat2 <- match(rownames(x), rownames(y))
      unname(y)[mat1, mat2]
  }
> m1 + foo(m1, m2)
#    a  b  c  d
# x NA NA NA NA
# y NA 11 10 NA
# z NA 14 13 NA
# w NA NA NA NA
> m3 + foo(m3, m1)
#    a  b  c  d
# x NA NA NA NA
# y NA 11 10 NA
# z NA 14 13 NA
# w NA NA NA NA