2011-04-21 5 views
7
matriz

entrada AR: ¿cómo combinar dos matrices de acuerdo con sus nombres de columna y fila?

 column1 column2 column3 column4 
row1 0   1   0   0 
row2 0   0   -1  0 
row3 1   0   0   -1 

matriz de entrada B

 column5 column6 column7 column8 
row1 0   1   0   0 
row2 0   0   -1  0 
row4 1   0   0   -1 

matriz de salida C

 column1 column2 column3 column4 column5 column6 column7 column8 
row1 0   1   0   0   0   1   0   0 
row2 0   0   -1  0   0   0   -1  0 
row3 1   0   0   -1   0   0   0   0 
row4 0   0   0   0   1   0   0   -1 

Observaciones: matriz A y matrizB tiene el nombre de la fila superpuesta. Sin embargo, todos los nombres de las columnas son diferentes.

Respuesta

19

Puede utilizar merge a hacerlo especificando los parámetros opcionales by y all:

#Reading data 
txt1 <- "column1 column2 column3 column4 
row1 0   1   0   0 
row2 0   0   -1  0 
row3 1   0   0   -1 
" 

txt2 <- "column5 column6 column7 column8 
row1 0   1   0   0 
row2 0   0   -1  0 
row4 1   0   0   -1 
" 
dat1 <- read.table(textConnection(txt1), header = TRUE) 
dat2 <- read.table(textConnection(txt2), header = TRUE) 

#Merge them together 
merge(dat1, dat2, by = "row.names", all = TRUE) 

rendirá

Row.names column1 column2 column3 column4 column5 column6 column7 column8 
1  row1  0  1  0  0  0  1  0  0 
2  row2  0  0  -1  0  0  0  -1  0 
3  row3  1  0  0  -1  NA  NA  NA  NA 
4  row4  NA  NA  NA  NA  1  0  0  -1 

Si desea reemplazar las AN con ceros, esto debería funcionar:

#Assign to an object 
zz <- merge(dat1, dat2, by = "row.names", all = TRUE) 
#Replace NA's with zeros 
zz[is.na(zz)] <- 0 
+2

nice solution. Puede agregar 'as.matrix (Fusionada [-1])' con 'rownames (newmatrix) <- Fusionada [, 1]' si necesita una matriz nuevamente. –

Cuestiones relacionadas