R:根据行和列名称添加矩阵

标签 r matrix addition

我有两个矩阵,我想根据它们的行名和列名求和。矩阵不一定具有共同的所有行和列 - 任一矩阵中可能会缺少一些行和列。

例如,考虑两个矩阵 A 和 B:

A=                 B=
  a b c d            a c d e
v 1 1 1 0          v 0 0 0 1
w 1 1 0 1          w 0 0 1 0
x 1 0 1 1          y 0 1 0 0
y 0 1 1 1          z 1 0 0 0

矩阵 A 中缺少 e 列,矩阵 B 中缺少 b 列。 矩阵 A 中缺少 z 行,矩阵 B 中缺少 x 行。

我正在寻找的汇总表是:

Sum=
  a b  c d e
v 1 1  1 0 1
w 1 1  0 2 0
x 1 0  1 1 na
y 0 1  2 1 0
z 1 na 0 0 0

最终矩阵中的行和列顺序并不重要,只要矩阵完整,即包含所有数据。缺失值不一定是“Na”,也可以是“0”。

我不确定是否有一种不涉及 for 循环的方法可以做到这一点。任何帮助将不胜感激。

我的解决方案

通过将矩阵转换为数据帧,按行绑定(bind)数据帧,然后将生成的数据帧转换回矩阵,我成功地轻松做到了这一点。这看起来可行,但也许有人可以仔细检查或让我知道是否有更好的方法。

library(reshape2)
A_df=as.data.frame(as.table(A))
B_df=as.data.frame(as.table(B))

merged_df=rbind(A_df,B_df)

Summed_matrix=acast(merged_df, Var1 ~ Var2, sum)

merged_df 看起来像这样:

   Var1 Var2 Freq
1     v    a    1
2     w    a    1
3     x    a    1
4     y    a    0
5     v    b    1
6     w    b    1
etc...

最佳答案

也许你可以尝试:

cAB <- union(colnames(A), colnames(B))
rAB <- union(rownames(A), rownames(B))

A1 <- matrix(0, ncol=length(cAB), nrow=length(rAB), dimnames=list(rAB, cAB))
B1 <- A1

indxA <- outer(rAB, cAB, FUN=paste) %in% outer(rownames(A), colnames(A), FUN=paste) 
indxB <- outer(rAB, cAB, FUN=paste) %in% outer(rownames(B), colnames(B), FUN=paste)
A1[indxA] <- A
B1[indxB] <- B

A1+B1 #because it was mentioned to have `0` as missing values
#  a b c d e
#v 1 1 1 0 1
#w 1 1 0 2 0
#x 1 0 1 1 0
#y 0 1 2 1 0
#z 1 0 0 0 0

如果您想获取 NA 作为缺失值

A1 <- matrix(NA, ncol=length(cAB), nrow=length(rAB), dimnames=list(rAB, cAB))
B1 <- A1

A1[indxA] <- A
B1[indxB] <- B

indxNA <- is.na(A1) & is.na(B1)
A1[is.na(A1)!= indxNA] <- 0
B1[is.na(B1)!= indxNA] <- 0


A1+B1
#  a  b c d  e
#v 1  1 1 0  1
#w 1  1 0 2  0
#x 1  0 1 1 NA
#y 0  1 2 1  0
#z 1 NA 0 0  0

或者使用reshape2

library(reshape2)
acast(rbind(melt(A), melt(B)), Var1~Var2, sum) #Inspired from the OP's idea
#  a b c d e
#v 1 1 1 0 1
#w 1 1 0 2 0
#x 1 0 1 1 0
#y 0 1 2 1 0
#z 1 0 0 0 0

数据

A <- structure(c(1L, 1L, 1L, 0L, 1L, 1L, 0L, 1L, 1L, 0L, 1L, 1L, 0L, 
1L, 1L, 1L), .Dim = c(4L, 4L), .Dimnames = list(c("v", "w", "x", 
"y"), c("a", "b", "c", "d")))

B <- structure(c(0L, 0L, 0L, 1L, 0L, 0L, 1L, 0L, 0L, 1L, 0L, 0L, 1L, 
0L, 0L, 0L), .Dim = c(4L, 4L), .Dimnames = list(c("v", "w", "y", 
"z"), c("a", "c", "d", "e")))

关于R:根据行和列名称添加矩阵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26042738/

相关文章:

用于将新列返回到数据集的 R 函数

matlab - 从矩阵中删除行

javascript - 添加动态行表不显示正确的行

java - 向对象添加点而不覆盖现有点

当某些列在 R 中具有某些值时删除某些列

r - 获得 Y 中 a 在 X 中的元素在 R 中的位置

R 检查 TRUE/FALSE 值列表的计算结果是否为 TRUE

r - 如何对 data.frame : R 中的多个升序/降序列进行排序

matrix - python : Transformation Matrix

java - 将数据值添加到搜索算法中?