2015-07-06 4 views
5

Скажем, у меня есть список индексов, как:R: Список индексов в бинарной матрице

l <- list(c(1,2,3), c(1), c(1,5), c(2, 3, 5)) 

, которые определяют ненулевые элементы в матрице, как:

(m <- matrix(c(1,1,1,0,0, 1,0,0,0,0, 1,0,0,0,5, 0,1,1,0,1), nrow=4, byrow=TRUE)) 

    [,1] [,2] [,3] [,4] [,5] 
[1,] 1 1 1 0 0 
[2,] 1 0 0 0 0 
[3,] 1 0 0 0 5 
[4,] 0 1 1 0 1 

Что такое самый быстрый способ, используя R, сделать m от l, при условии, что матрица очень большая, скажем, 50 000 строк и 2000 столбцов?

+0

Как вы знаете, когда ставить, скажем, 5? –

+0

Я предполагаю, что значение '5' является опечаткой. – akrun

ответ

5

Попробуйте

d1 <- stack(setNames(l, seq_along(l))) 
library(Matrix) 
m1 <- sparseMatrix(as.numeric(d1[,2]), d1[,1], x=1) 
as.matrix(m1) 
#  [,1] [,2] [,3] [,4] [,5] 
#[1,] 1 1 1 0 0 
#[2,] 1 0 0 0 0 
#[3,] 1 0 0 0 1 
#[4,] 0 1 1 0 1 

Или вместо stack, мы могли бы использовать melt

library(reshape2) 
d2 <- melt(l) 
sparseMatrix(d2[,2], d2[,1],x=1) 

Или только с помощью base R

Un1 <- unlist(l) 
m1 <- matrix(0, nrow=length(l), ncol=max(Un1)) 
m1[cbind(as.numeric(d1$ind), d1$values)] <- 1 
m1 
+1

Люблю индексирование матрицы в вашей третьей попытке. Моя любимая малоиспользуемая особенность R! – Aaron

+0

@Aaron Спасибо за комментарии. Я думаю, что 'sparseMatrix' будет быстрее индексации. – akrun

+0

Спасибо, все это полезно! – Misconstruction

Смежные вопросы