r - 使用 for 循环将交易列表中的值放入稀疏矩阵中

标签 r for-loop replace sparse-matrix transactional

我生成了一个事务列表,其中包括用户 ID、项目 ID 以及用户-项目对出现的频率:

UserID ItemID   N
X      S123     4
X      S134     3
X      S135    10
Y      S564     1
Y      S432     2
Z      S189     3

在此列表中,我想创建一个稀疏矩阵,其中行表示用户 ID,列表示 ItemID,单元格是相应的计数,或者如果该对从未出现过 0。

我写了一个 for 循环,它可以工作,但不幸的是,当行数 > 100.000 和列数 > 2000 时,它会永远持续下去:

for(i in 1:nrow(mat)){
  for(j in 1:ncol(mat)){

   r <- rownames(mat)[i]
   c <- colnames(mat)[j]

   mat[i,j] <- ifelse(length(trans[(trans$UserID == r) & (trans$ItemID ==  c), "N"]) > 0, trans[(trans$UserID == r) & (trans$ItemID == c), "N"], 0)    

 }
}

那么,有没有更快的方法呢?

最佳答案

我们可以使用Matrix中的sparseMatrix

library(Matrix)
c1 <- as.numeric(factor(df1$ItemID, levels=unique(df1$ItemID)))
r1 <- as.numeric(factor(df1$UserID, levels=unique(df1$UserID)))
sP1 <- sparseMatrix(r1, c1, x=df1$N)
dimnames(sP1) <- list(unique(df1$UserID), unique(df1$ItemID))

sP1
#   3 x 6 sparse Matrix of class "dgCMatrix"
#    S123 S134 S135 S564 S432 S189
#X    4    3   10    .    .    .
#Y    .    .    .    1    2    .
#Z    .    .    .    .    .    3

关于r - 使用 for 循环将交易列表中的值放入稀疏矩阵中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34963237/

相关文章:

R:通过将一个函数与另一个函数组合来设置该函数的参数

java - 重复函数的时间呈指数增加

r - 如何使用Rcpp加速for循环?

search - 如何使用批处理搜索和替换区分大小写的字符串

javascript - 替换文本功能在资源管理器中不起作用

r - 在 shiny 中,是否可以获取服务器中 ui 元素的大小?

r - "incomplete final line"的更多问题

r - 我在 R 中有一个大表,现在我想选择奇数行并在该行的第一个元素之前粘贴一个标签

c++以对数方式增加for循环增量

javascript - 从字符串中删除某些 HTML