R:索引列表转换为二进制矩阵

5

假设我有一个索引列表,如下:

l <- list(c(1,2,3), c(1), c(1,5), c(2, 3, 5))

这是用于指定矩阵中非零元素的方法,例如:

(m <- matrix(c(1,1,1,0,0, 1,0,0,0,0, 1,0,0,0,5, 0,1,1,0,1), nrow=4, byrow=TRUE))

     [,1] [,2] [,3] [,4] [,5]
[1,]    1    1    1    0    0
[2,]    1    0    0    0    0
[3,]    1    0    0    0    5
[4,]    0    1    1    0    1

使用R,从矩阵l生成矩阵m的最快方法是什么?假设矩阵非常大,例如有50000行和2000列。

你如何知道何时应该输入5? - user3710546
我猜测值 5 是一个打字错误。 - akrun
2个回答

5

尝试

d1 <- stack(setNames(l, seq_along(l)))
library(Matrix)
m1 <- sparseMatrix(as.numeric(d1[,2]), d1[,1], x=1)
as.matrix(m1)
#     [,1] [,2] [,3] [,4] [,5]
#[1,]    1    1    1    0    0
#[2,]    1    0    0    0    0
#[3,]    1    0    0    0    1
#[4,]    0    1    1    0    1

或者,我们可以使用melt代替stack

library(reshape2)
d2 <- melt(l)
sparseMatrix(d2[,2], d2[,1],x=1)

或者仅使用基础的 R 语言。
Un1 <- unlist(l)
m1 <- matrix(0, nrow=length(l), ncol=max(Un1))
m1[cbind(as.numeric(d1$ind), d1$values)] <- 1
m1

1
喜欢你第三次尝试中的矩阵索引。这是我最喜欢但很少使用的R功能之一! - Aaron left Stack Overflow
@Aaron 感谢您的评论。我认为sparseMatrix会比索引更快。 - akrun
谢谢,这些都很有帮助! - Misconstruction
@akrun:我也这么想。 - Aaron left Stack Overflow
空列表元素怎么办?我在原帖中添加了这个编辑。 - Misconstruction
@Misconstruction 请将其作为单独的问题发布,因为您的原始问题已经解决。 - akrun

1

对我来说,以下方法至少比上面的建议快3倍,在问题中指定的数据大小(5e4 x 2e3)上:

  unlist_l <- unlist(l)
  M <- matrix(0, nrow = length(l), ncol = max(unique(unlist_l)))
  ij <- cbind(rep(1:length(l), lengths(l)), unlist_l)
  M[ij] <- 1

性能可能取决于数据大小和稀疏程度。


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