2016-01-23 42 views
2

我生成一个事务列表,其包括用户ID,项目ID和用户 - 项目对如何经常occures计数:配售从事务列表中的值到一个稀疏矩阵与一个for循环

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

缺货的列表我想创建一个稀疏矩阵,其中行代表用户ID和列表示ItemID,并且单元格是相应的计数,或者如果该对从未出现过0. 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)  

} 
} 

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

回答

3

我们可以使用sparseMatrixMatrix

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