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

时间:2015-01-01 13:53:47

标签: r join dataframe rows

我们说我有矩阵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个(用NAs替换丢失的数据):

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

如何做到这一点?感谢。

2 个答案:

答案 0 :(得分:3)

你的标题是" matrices"但是您的问题已标记为data.frame,因此,这是一种假设您正在处理data.frame s的方法:

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

一般的想法是使用mget来捕获list中的所有相关对象(当然,您也可以手动执行此操作)。然后,使用list melt方法将所有内容组合成一个&#34; long&#34; 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

答案 1 :(得分:2)

看起来这样可行。只需将行名称与Value矩阵匹配,然后替换为子集。 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