将稀疏矩阵索引列表转换为R中的矩阵

5

我有一个字符串列表:

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,因此将得到一个2x6矩阵,如下所示:

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

这种转换怎样实现?

你的意思是要写成 matrix(c(23,3, 吗? - Eric Brooks
“所有其他条目都为零”是错误的,或者最多是令人困惑的... - Frank
@EricBrooks 谢谢,已更正。 - spore234
2个回答

4
解决方案:
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

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

unnest(setNames(dat, seq_along(dat)),col)stack(dat) 非常相似。在后者中,as.numericind 上的作用与前者中的 col 同样有效。 - Frank
1
或者,实际上可以使用 unnest(dat,col) ,以保持它在tidyr/dplyr中 :) 不需要重新命名。 - Frank
@Frank 但是在sparseMatrix中,我需要数字索引。例如:d1 <- unnest(dat,col) %>% separate(x, into=c('row', 'val'), ':', convert=TRUE)。然后我可以使用sub来提取数字部分并转换为数字索引。 - akrun
@Frank按照您的建议进行了一些修改。看起来还不错吗? - akrun
1
哦,问题在于unnest的行为是根据stringsAsFactors=FALSE来执行的。这个可以正常工作:d1 <- stack(dat) %>% separate(values, into=c('row', 'val'), ':', convert=TRUE) %>% mutate(col=as.numeric(ind))。但是这个会失败:d1 <- unnest(dat,col) %>% separate(x, into=c('row', 'val'), ':', convert=TRUE) %>% mutate(col=as.numeric(col))。当然,看起来不错 :) - Frank
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接