我想使用它们的行名称合并几个矩阵。 这些矩阵的行和列数不同。 例如:
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
是否有一种优雅的方式来合并这些矩阵?
答案 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