如何在不使用lapply的情况下将列表列表转换为R中的稀疏矩阵?

Ron*_*Ron 2 r sparse-matrix

我有一个由bigsplit()操作产生的列表列表(来自biganalytics包,bigmemory包的一部分).

每个列表表示矩阵中的列,并且每个列表项是二进制矩阵中值1的索引.

将此列表转换为稀疏二进制(0/1)矩阵的最佳方法是什么?在lapply()中使用lapply()是唯一的解决方案吗?如何将列表命名为列的名称?

Jor*_*eys 5

如果你需要一个矩阵,你可以在没有任何屈服的情况下做到这一点.

假设你有一个像这样构造的列表:

Test <- list(
    col1=list(2,4,7),
    col2=list(3,2,6,8),
    col3=list(1,4,5,3,7)
)
Run Code Online (Sandbox Code Playgroud)

首先,构造一个具有正确尺寸的零的矩阵.如果您事先了解它们,那很容易.否则你可以轻松派生:

n.cols <- length(Test)
n.ids <- sapply(Test,length)
n.rows <- max(unlist(Test))
out <- matrix(0,nrow=n.rows,ncol=n.cols)
Run Code Online (Sandbox Code Playgroud)

然后,您使用矩阵按列填充的事实来计算必须成为一个的每个单元格的索引:

id <- unlist(Test)+rep(0:(n.cols-1),n.ids)*n.rows
out[id] <- 1
colnames(out) <- names(Test)
Run Code Online (Sandbox Code Playgroud)

这给出了:

> out
     col1 col2 col3
[1,]    0    0    1
[2,]    1    1    0
[3,]    0    1    1
[4,]    1    0    1
[5,]    0    0    1
[6,]    0    1    0
[7,]    1    0    1
[8,]    0    1    0
Run Code Online (Sandbox Code Playgroud)