在 R 中创建稀疏矩阵

Creating a sparse matrix in R

我有一个数据框 Likes n 个用户和 m 个 likes,useridlikeid1 : likeidm 作为我的变量。具体用户 ID 存储在第 1 列(Likes$userid),单元格包含 1 或 0,具体取决于用户是否喜欢具有相应 likeid 的页面。

library(Matrix)

Likes <- data.frame(userid=c("n1","n2"),
                      m1=c(0,1),
                      m2=c(0,0),
                      m3=c(0,0),
                      m4=c(1,0)
                      )

Likes [1,1:5]

  userid       m1          m2          m3          m4
1 n1           0           0           0           1

现在,我想创建一个稀疏矩阵。我将如何在以下代码中指定 j ?我知道我这样做的方式不对,因为从技术上讲,id 不在列中,但已经在我的数据框中指定为变量。

sM_Likes <- sparseMatrix(Likes, i=likes$userid, j=1,c(2:ncol(Likes)), x=1)

提前致谢(请为这个非常基本的问题道歉)。

我试图通过构建一个像您在问题中描述的对象(我现在已经将其编辑到问题中)并向其附加一些额外的假行来重现该问题。

library(Matrix)

Likes <- data.frame(userid=c("n1","n2"),
                      m1=c(0,1),
                      m2=c(0,0),
                      m3=c(0,0),
                      m4=c(1,0)
                      )

我发现 运行 你的代码抛出了不同的错误:

sM_Likes <- sparseMatrix(Likes, i=likes$userid, j=1,c(2:ncol(Likes)), x=1)

Error in sparseMatrix(Likes, i = likes$userid, j = 1, c(2:ncol(Likes)), : exactly one of 'i', 'j', or 'p' must be missing from call

我在评论中提到过几次,因为我认为是导致问题的原因。您更正了 j 参数的规范,现在可以使用了:)

您在有关列名称的评论中还提出了一个跟进问题。我认为这应该可以解决:

devtools::install_github("ben519/mltools")
require(mltools)
dt <- data.table(
  intCol=c(1L, NA_integer_, 3L, 0L),
  realCol=c(NA, 2, NA, NA),
  logCol=c(TRUE, FALSE, TRUE, FALSE),
  ofCol=factor(c("a", "b", NA, "b"), levels=c("a", "b", "c"), ordered=TRUE),
  ufCol=factor(c("a", NA, "c", "b"), ordered=FALSE)
)

sparsify(dt)
sparsify(dt, sparsifyNAs=TRUE)
sparsify(dt[, list(realCol)], naCols="identify")
sparsify(dt[, list(realCol)], naCols="efficient")