将事务列表中的值放入带有for循环的稀疏矩阵中

时间:2016-01-23 12:07:34

标签: 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循环,它可以工作,但遗憾的是,行数和gt; 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)    

 }
}

那么,有更快的方法吗?

1 个答案:

答案 0 :(得分:3)

我们可以使用Matrix

中的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
netflix.cadmium.objects.videoPlayer();