2014-09-11 2 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

ответ

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 
Смежные вопросы