2015-07-06 26 views
5

Nói rằng tôi có một danh sách các chỉ số, như:R: Danh sách các chỉ số để ma trận nhị phân

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

nào xác định các yếu tố khác không trong một ma trận, như:

(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 

là gì cách nhanh nhất, sử dụng R, để thực hiện m từ l, cho rằng ma trận là rất lớn, nói 50.000 hàng và 2000 cột?

+0

Làm thế nào để bạn biết khi nào thì đưa, nói, 5? –

+0

Tôi đoán giá trị '5' là lỗi đánh máy. – akrun

Trả lời

5

Hãy thử

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 

Hoặc thay vì stack, chúng ta có thể sử dụng melt

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

Hoặc chỉ sử dụng 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

Yêu ma trận lập chỉ mục trong lần thử thứ ba của bạn. Tính năng ít được sử dụng nhất của R! – Aaron

+0

@Aaron Cảm ơn các ý kiến. Tôi nghĩ rằng 'sparseMatrix' sẽ nhanh hơn chỉ mục. – akrun

+0

Cảm ơn, tất cả những điều này đều hữu ích! – Misconstruction

Các vấn đề liên quan