如何根据行名组合不同的矩阵?

How to combine different matries acording to their row names?

假设我有矩阵 A:

rows.names  Value
----------------
man         NA
woman       NA
girl        NA
boy         NA
cat         NA
dog         NA

还有一些矩阵(B、C、D 等)如下所示:

rows.names  V1
--------------
woman       3
dog         5


rows.names  V2
--------------
man         4
woman       7
cat         6

rows.names  V3
---------------
boy         17
cat         10
dog         1

我想根据 row.names 加入那 4 个(用 NA 替换缺失的数据):

row.names   Value   V1   V2   V3
--------------------------------
man         NA      NA   4    NA
woman       NA      3    7    NA
girl        NA      NA   NA   NA
boy         NA      NA   NA   17
cat         NA      NA   6    10
dog         NA      5    NA   1

如何做到这一点?谢谢

你的标题说 "matrices" 但你的问题被标记为 data.frame,所以这里有一个方法假设你正在处理 data.frames:

df1 <- data.frame(rn = c("man", "woman", "girl", "boy", "cat", "dog"), 
                  Value = NA)
df2 <- data.frame(rn = c("woman", "dog"), V1 = c(3, 5))
df3 <- data.frame(rn = c("man", "woman", "cat"), V2 = c(4, 7, 6))
df4 <- data.frame(rn = c("boy", "cat", "dog"), V3 = c(17, 10, 1))

library(reshape2)
dcast(melt(mget(ls(pattern = "df\d")), id.vars = "rn"), 
      rn ~ variable, value.var = "value")
#      rn Value V1 V2 V3
# 1   boy    NA NA NA 17
# 2   cat    NA NA  6 10
# 3   dog    NA  5 NA  1
# 4  girl    NA NA NA NA
# 5   man    NA NA  4 NA
# 6 woman    NA  3  7 NA

一般的想法是使用 mgetlist 中捕获所有相关的 objects(当然,您也可以手动执行此操作)。然后,使用meltlist方法将所有内容组合成"long"data.frame。然后可以使用 dcast.

轻松地对其进行重塑

如果您有矩阵,方法类似(可能更简单):

m1 <- `rownames<-`(as.matrix(df1[-1]), df1[[1]])
m2 <- `rownames<-`(as.matrix(df2[-1]), df2[[1]])
m3 <- `rownames<-`(as.matrix(df3[-1]), df3[[1]])
m4 <- `rownames<-`(as.matrix(df4[-1]), df4[[1]])

dcast(melt(mget(ls(pattern = "m\d"))), Var1 ~ Var2, value.var = "value")
#    Var1 Value V1 V2 V3
# 1   man    NA NA  4 NA
# 2 woman    NA  3  7 NA
# 3  girl    NA NA NA NA
# 4   boy    NA NA NA 17
# 5   cat    NA NA  6 10
# 6   dog    NA  5 NA  1

看起来这行得通。只需将行名称与值矩阵匹配,然后替换为一个子集。 vapply 会将其简化为我们可以 cbind 与主矩阵一起使用的矩阵。

mlist <- list(m2, m3, m4)

newPart <- vapply(mlist, function(x) {
        x[match(rownames(m1), rownames(x))]
    }, numeric(nrow(m1)))

cbind(m1, provideDimnames(newPart))
#       Value  A  B  C
# man      NA NA  4 NA
# woman    NA  3  7 NA
# girl     NA NA NA NA
# boy      NA NA NA 17
# cat      NA NA  6 10
# dog      NA  5 NA  1