在R中粘贴矩阵

时间:2014-09-11 10:54:15

标签: r matrix

我有一个关于粘贴矩阵的问题。我有一组10个矩阵,它们具有相同的行名但不同的列名,例如

矩阵1:

   A B C D
a  1 0 0 0
b  0 1 0 0
c  0 1 0 0
d  0 0 1 0 
e  0 0 0 1

矩阵2:

  A B D E F
a 1 0 0 0 0
b 0 1 0 0 0
c 0 1 0 0 0 
d 0 0 0 0 0
e 0 0 1 0 0

我想将两个矩阵格式化为

  A B C D E F
a 1 0 0 0 0 0
b 0 1 0 0 0 0
c 0 1 0 0 0 0
d 0 0 1 0 0 0
e 0 0 0 1 0 0

如何在没有循环的情况下在R中快速完成? 谢谢!

2 个答案:

答案 0 :(得分:3)

示例数据:

mat1 <- data.matrix(read.table(text="A B C D
a  1 0 0 0
b  0 1 0 0
c  0 1 0 0
d  0 0 1 0 
e  0 0 0 1", header = TRUE, row.names = 1))

mat2 <- data.matrix(read.table(text="A B D E F
a 1 0 0 0 0
b 0 1 0 0 0
c 0 1 0 0 0 
d 0 0 0 0 0
e 0 0 1 0 0", header = TRUE, row.names = 1))

假设您将所有矩阵放在一个列表中(如果没有,请创建一个)

mat.list <- list(mat1, mat2)

我们的第一步是将矩阵转换为data.frames。这将使算法有效地利用内存:

df.list <- lapply(mat.list, as.data.frame)

我们编写一个函数来合并两个data.frames:

cat.df <- function(d1, d2) {d1[names(d2)] <- d2; d1}

我们将所有data.frames迭代地合并为一个大数据框架:

one.df <- Reduce(cat.df, df.list)

最后,我们将其转换为矩阵:

one.mat <- data.matrix(one.df)

答案 1 :(得分:1)

如果您使用for循环,我不确定速度是否会有任何差异。使用几个矩阵和@ flodel的数据集

mat3 <- structure(c(1L, 0L, 0L, 0L, 0L, 0L, 1L, 1L, 0L, 0L, 0L, 0L, 0L, 
0L, 1L, 1L, 0L, 1L, 0L, 0L, 0L, 0L, 1L, 1L, 1L), .Dim = c(5L, 
5L), .Dimnames = list(c("a", "b", "c", "d", "e"), c("A", "B", 
"D", "G", "H")))

mat4 <- structure(c(0L, 1L, 1L, 0L, 0L, 0L, 0L, 0L, 1L, 0L, 0L, 0L, 0L, 
0L, 1L, 0L, 0L, 1L, 1L, 1L, 1L, 0L, 1L, 0L, 0L), .Dim = c(5L, 
5L), .Dimnames = list(c("a", "b", "c", "d", "e"), c("B", "C", 
"D", "H", "I")))

lst1 <- mget(ls(pattern="^mat\\d+"))

  mRes <- lst1[[1]]
  for(i in seq_along(lst1)){
  indx <- setdiff(colnames(lst1[[i]]), colnames(mRes))
  mRes <-cbind(mRes, lst1[[i]][,indx, drop=FALSE])
  mRes
  }  

   mRes
 #  A B C D E F G H I
 #a 1 0 0 0 0 0 1 0 1
 #b 0 1 0 0 0 0 0 0 0
 #c 0 1 0 0 0 0 1 1 1
 #d 0 0 1 0 0 0 0 1 0
 #e 0 0 0 1 0 0 0 1 0