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