2014-09-11 232 views
2

我有一個關於粘貼矩陣的問題。我有一組具有相同行名但不同列名的10個矩陣,例如粘貼矩陣R

矩陣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中沒有循環? 謝謝!

+0

如果列出現在多個矩陣中,如'A'在這裏,該怎麼辦?我們是否假設這些價值將永遠是一樣的?如果它們有區別呢? – flodel 2014-09-11 11:01:20

回答

2

的樣本數據:

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,變成一個大數據.frame:

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

最後,我們把它轉換成一個矩陣:

one.mat <- data.matrix(one.df) 
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