【问题标题】:Placing values from transaction list into a sparse matrix with a for loop使用 for 循环将事务列表中的值放入稀疏矩阵
【发布时间】:2016-04-30 00:41:57
【问题描述】:

我生成了一个交易列表,其中包括一个用户 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)    

 }
}

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

【问题讨论】:

    标签: r for-loop replace sparse-matrix transactional


    【解决方案1】:

    我们可以从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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-12-07
      • 2018-01-19
      • 1970-01-01
      • 2017-05-11
      • 2018-05-10
      • 2017-01-28
      • 1970-01-01
      • 2013-10-21
      相关资源
      最近更新 更多