如何在R中合并具有不同行数的矩阵

时间:2016-06-29 10:30:45

标签: r matrix merge

我想使用它们的行名称合并几个矩阵。 这些矩阵的行和列数不同。 例如:

m1 <- matrix(c(1, 2, 3, 4, 5, 6), 3, 2)
rownames(m1) <- c("a","b","c")
m2 <- matrix(c(1, 2, 3, 5, 4, 5, 6, 2), 4, 2)
rownames(m2) <- c("a", "b", "c", "d")
m3 <- matrix(c(1, 2, 3, 4), 2,2)
rownames(m3) <- c("d", "e")

mlist <- list(m1, m2, m3)

对于他们我想得到:

Row.names    V1.x    V2.x    V1.y    V2.y   V1.z    V2.z
        a     1       4       1       4      NA      NA
        b     2       5       2       5      NA      NA
        c     3       6       3       6      NA      NA
        d    NA      NA       5       2       1       3
        e    NA      NA      NA      NA       2       4

我试图在函数merge中使用lapply:

M <- lapply(mlist, merge, mlist, by = "row.names", all = TRUE)

然而,它没有用:

  

data.frame(c(1,2,3,4,5,6),c(1,2,3,5,4,5,6,2),c(1,:     参数意味着不同的行数:3,4,2

是否有一种优雅的方式来合并这些矩阵?

3 个答案:

答案 0 :(得分:2)

您正尝试将缩减(?Reduce)应用于矩阵列表,其中缩减基本上为merge。问题是merge(m1, m2, by = "row.names", all = T)没有为您提供带有行名称的新合并矩阵,而是返回第一列中的行名称。这就是我们在缩减功能中需要额外逻辑的原因。

Reduce(function(a,b) {
         res <- merge(a,b,by = "row.names", all = T); 
         rn <- res[,1]; # Row.names column of merge
         res <- res[,-1]; # Actual data
         row.names(res) <- rn; # Assign row.names
         return(res) # Return the merged data with proper row.names
       }, 
       mlist[-1], # Reduce (left-to-right) by applying function(a,b) repeatedly
       init = mlist[[1]] # Start with the first matrix
)

答案 1 :(得分:0)

或者:

df <- mlist[[1]]
for (i in 2:length(mlist)) {
    df <- merge(df, mlist[[i]], by = "row.names", all=T)
    rownames(df) <- df$Row.names
    df <- df[ , !(names(df) %in% "Row.names")]  
}

  # V1.x V2.x V1.y V2.y V1 V2
# a    1    4    1    4 NA NA
# b    2    5    2    5 NA NA
# c    3    6    3    6 NA NA
# d   NA   NA    5    2  1  3
# e   NA   NA   NA   NA  2  4

答案 2 :(得分:0)

如果将正确的长格式array pointers传递给函数,这也可以概念化为reshape操作:

data.frame