2016-06-02 2 views
1

Я пытаюсь создать матрицу смежности M из списка pList, содержащего индексы, которые должны быть равны 1 в матрице M. Например, M является матрицей 10x5 Переменная Plist содержит 5 элементов, каждый из которых представляет собой вектор индексовR Заполнить матрицу со списком индексов

Пример:

s <- list("1210", c("254", "534"), "254", "534", "364") 
M <- matrix(c(rep(0)),nrow = 5, ncol = length(unique(unlist(s))), dimnames=list(1:5,unique(unlist(s)))) 

на самом деле, мой слишком простым решением является жестоким одна с цикл по строкам матрицы:

for (i in 1:nrow(M)){ 
     M[i, as.character(s[[i]])] <- 1 
} 

Так что ожидаемый результат:

M 
    1210 254 534 364 
1 1 0 0 0 
2 0 1 1 0 
3 0 1 0 0 
4 0 0 1 0 
5 0 0 0 1 

Проблема заключается в том, что я должен манипулировать матрицы с несколькими тысячами строк, и это занимает слишком много времени. Я не эксперт «применить», но мне интересно, если есть быстрое решение

Благодаря

С уважением

ответ

2

Мы можем преобразовать list в matrix из row/column индекса, использовать этот индекс для присвоения элементы «M» до 1.

M[as.matrix(stack(setNames(s, seq_along(s)))[,2:1])] <- 1 
M 
# 1210 254 534 364 
#1 1 0 0 0 
#2 0 1 1 0 
#3 0 1 0 0 
#4 0 0 1 0 
#5 0 0 0 1 

Или вместо использования stack преобразовать в data.frame, мы можем unlist Буква «S», чтобы получить индекс столбца, cbind с индексом строки, созданного путем репликации последовательности list с length каждого list элемента (с использованием lengths) и присвоить элементы в «M» в 1.

M[cbind(rep(seq_along(s), lengths(s)), unlist(s))] <- 1 

Или еще один вариант должен был бы создать sparseMatrix

library(Matrix) 
Un1 <- unlist(s) 
sparseMatrix(i = rep(seq_along(s), lengths(s)), 
      j=as.integer(factor(Un1, levels = unique(Un1))), 
      x=1) 
Смежные вопросы