#r #merge #matrix
#r #слияние #матрица
Вопрос:
Входная матрица A
column1 column2 column3 column4
row1 0 1 0 0
row2 0 0 -1 0
row3 1 0 0 -1
Входная матрица B
column5 column6 column7 column8
row1 0 1 0 0
row2 0 0 -1 0
row4 1 0 0 -1
Выходная матрица 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
Примечания: матрицы A и matrixB получили перекрывающиеся имена строк. Однако имена всех столбцов разные.
Ответ №1:
Вы можете использовать merge
для этого, указав необязательные параметры by
и 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)
Даст
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
Если вы хотите заменить NAS нулями, это должно сработать:
#Assign to an object
zz <- merge(dat1, dat2, by = "row.names", all = TRUE)
#Replace NA's with zeros
zz[is.na(zz)] <- 0
Комментарии:
1. отличное решение. Вы могли бы добавить
as.matrix(Merged[-1])
сrownames(newmatrix) <- Merged[,1]
, если ему снова понадобится матрица.