2015-05-13 146 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

您的意思是写'矩阵(C(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

'unnest(setNames(dat,seq_along(dat)),col)'与'stack(dat)'非常相似''as.numeric'的作用与在后者的'ind'上就像前面的'col'一样 – Frank

+0

@Frank首先,我使用'stack'(在编辑),但后来认为人们喜欢'unnest' over'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