2015-05-13 4 views
5

У меня есть этот список строк:список новообращенного разреженных индексов матрицы к матрице в R

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

элементы списка V1 и V2 являются столбцы. 1:23 означает, что «первая запись в этом столбце имеет значение 23». Все остальные записи должны быть равны нулю. размерность матрицы обозначается самой высокой записи, в данном случае мы имеем 2 колонки (V1 и V2) и наибольшее число строк является 6, так что это привело бы к матрице 2х6, например так:

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

Как можно достичь этого преобразования?

+0

ли писать 'матрицу (с (23,3 вы имеете в виду,' –

+0

"Все остальные элементы равны нулю" является ложным, или в лучшем случае путают ... – Frank

+0

@EricBrooks спасибо, исправлено – spore234

ответ

4

Вы также можете попробовать

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

'disest (setNames (dat, seq_along (dat)), col)' очень похоже на 'stack (dat)'. 'as.numeric' работает так же, как и ну на 'ind' в последнем, как на' col' в первом. – Frank

+0

@Frank Во-первых, я использовал 'stack' (в), но затем подумал, что люди, такие как 'disest' над' stack', а также используя функции, главным образом, из 'tidyr/dplyr', делают его более привлекательным :-) – akrun

+1

Или, фактически,' unnest (dat, col) ', чтобы сохранить его в tidyr/dplyr :) Не нужно переименовывать – Frank

3

Решение:

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