2016-01-23 47 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