使用 for 循环将交易列表中的值放入稀疏矩阵
Placing values from transaction list into a sparse matrix with a for loop
我生成了一个交易列表,其中包括一个用户 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)
}
}
那么,有没有更快的方法呢?
我们可以使用 sparseMatrix
来自 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
我生成了一个交易列表,其中包括一个用户 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)
}
}
那么,有没有更快的方法呢?
我们可以使用 sparseMatrix
来自 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