2015-05-13 44 views
5

Tôi có danh sách các chuỗi:chuyển đổi danh sách các chỉ số ma trận thưa thớt để ma trận R

dat <- list(V1=c("1:23","4:12"),V2=c("1:3","2:12","6:3")) 

các yếu tố danh sách V1 và V2 là các cột. 1:23 có nghĩa là "mục nhập đầu tiên trong cột này có giá trị 23". Tất cả các mục nhập khác phải bằng 0. Kích thước của ma trận được chỉ định bởi mục nhập cao nhất, trong trường hợp này chúng tôi có 2 cột (V1 và V2) và số hàng cao nhất là 6, vì vậy sẽ dẫn đến ma trận 2x6 như sau:

matrix(c(23,3, 
    0,12, 
    0,0, 
    12,0, 
    0,0, 
    0,3),nrow=6,ncol=2,byrow=T) 

cách hội tụ này có thể đạt được như thế nào?

+0

Ý của bạn là để viết 'ma trận (c (23,3, ' –

+0

"Tất cả các mục khác đều không" là sai, hoặc tại khó hiểu nhất ... – Frank

+0

@EricBrooks cảm ơn, sửa chữa – spore234

Trả lời

4

Bạn cũng có thể thử

library(dplyr) 
library(tidyr) 
library(Matrix) 

d1 <- unnest(dat,col) %>% 
      separate(x, into=c('row', 'val'), ':', convert=TRUE) %>% 
      extract(col, into='col', '\\D+(\\d+)', convert=TRUE) 

as.matrix(with(d1, sparseMatrix(row, col, x=val))) 
#  [,1] [,2] 
#[1,] 23 3 
#[2,] 0 12 
#[3,] 0 0 
#[4,] 12 0 
#[5,] 0 0 
#[6,] 0 3 
+0

'unnest (setNames (dat, seq_along (dat)), col)' rất giống với 'stack (dat)'. 'as.numeric' hoạt động giống như tốt về 'ind' trong cái sau như trên' col' trong cái cũ. – Frank

+0

@Frank Đầu tiên, tôi đã sử dụng 'stack' (trong chỉnh sửa), nhưng sau đó nghĩ rằng những người như 'unnest' trên' stack' và cũng sử dụng các hàm chủ yếu từ 'tidyr/dplyr' làm cho nó hấp dẫn hơn :-) – akrun

+1

Hoặc, thực sự,' unnest (dat, col) 'để giữ nó trong tidyr/dplyr :) Không cần phải đổi tên – Frank

3

Giải pháp:?

dat <- list(V1=c("1:23","4:12"),V2=c("1:3","2:12","6:3")) 
y <- inverse.rle(list(values = 1:length(dat),lengths = sapply(dat,length))) 

x <- as.numeric(unlist(sapply(dat,function(y)sapply(strsplit(y,":"),function(x)x[1])))) 
val <- as.numeric(unlist(sapply(dat,function(y)sapply(strsplit(y,":"),function(x)x[2])))) 

num_row <- max(x) 
num_col <- max(y) 
m = matrix(0, nrow = num_row, ncol = num_col) 
m[cbind(x,y)] <- val 
m 
Các vấn đề liên quan