R 从数据帧创建稀疏矩阵

R 从数据帧创建稀疏矩阵,r,machine-learning,sparse-matrix,R,Machine Learning,Sparse Matrix,我正在做一项作业,试图为Netflix大奖数据建立一个协作过滤模型。我使用的数据是在一个CSV文件中,我可以轻松地将其导入到数据框中。现在我需要做的是创建一个稀疏矩阵,由用户作为行,电影作为列组成,每个单元格由相应的评级值填充。当我试图在数据框中映射出值时,我需要为数据框中的每一行运行一个循环,这在R中花费了很多时间,请大家推荐一个更好的方法。以下是示例代码和数据: buildUserMovieMatrix <- function(trainingData) { UIMatrix &l

我正在做一项作业,试图为Netflix大奖数据建立一个协作过滤模型。我使用的数据是在一个CSV文件中,我可以轻松地将其导入到数据框中。现在我需要做的是创建一个稀疏矩阵,由用户作为行,电影作为列组成,每个单元格由相应的评级值填充。当我试图在数据框中映射出值时,我需要为数据框中的每一行运行一个循环,这在R中花费了很多时间,请大家推荐一个更好的方法。以下是示例代码和数据:

buildUserMovieMatrix <- function(trainingData)
{
  UIMatrix <- Matrix(0, nrow = max(trainingData$UserID), ncol = max(trainingData$MovieID), sparse = T);
  for(i in 1:nrow(trainingData))
  {
    UIMatrix[trainingData$UserID[i], trainingData$MovieID[i]] = trainingData$Rating[i];
  }
  return(UIMatrix);
}
所以最后我想要这样的东西: 列是电影ID,行是用户ID

    1   2   3   4   5   6   7
1   0   0   0   0   0   0   0
2   3   0   0   0   0   0   0
3   0   3   0   0   0   0   0
4   0   4   0   0   0   0   0
5   0   0   0   0   0   0   0
6   0   3   0   0   0   0   0
7   0   3   0   0   0   0   0

所以解释是这样的:用户2将电影1评为三星级,用户3将电影2评为三星级,其他用户和电影依此类推。在我的数据框中大约有8500000行,我的代码只需要30-45分钟就可以创建这个用户项矩阵,我想得到任何建议,这可能比循环快

library(reshape2)
m <- dcast(df,UserID~MovieID,fill=0)[-1]
m
#   1 2
# 1 3 0
# 2 0 3
# 3 0 4
# 4 0 3
# 5 0 3
library(重塑2)

m矩阵
包有一个专门为您的数据类型制作的构造函数:

library(Matrix)
UIMatrix <- sparseMatrix(i = trainingData$UserID,
                         j = trainingData$MovieID,
                         x = trainingData$Rating)

(但我绝对推荐使用
sparseMatrix
方法。),此方法无法正确映射用户ID和电影ID,例如,用户11从培训数据中丢失,因此现在在第11行中,我有用户12的用户ID和电影ID评级,随后所有行都被1移位,我的训练集中有10916个用户,我希望将所有用户都保留在我的用户项矩阵中,如果我的训练数据中缺少用户,我可以将整行向量标记为零,这将防止训练数据帧和我的矩阵中出现任何不匹配的情况,你可以建议其他方法吗,谢谢sparseMatrix方法比第二种方法工作得更快,谢谢。:)
library(data.table)
DT <- as.data.table(df)
m  <- dcast(DT,UserID~MovieID,fill=0)[-1]
setDT(df)
m  <- dcast(df,UserID~MovieID,fill=0)[-1]
library(Matrix)
UIMatrix <- sparseMatrix(i = trainingData$UserID,
                         j = trainingData$MovieID,
                         x = trainingData$Rating)
buildUserMovieMatrix <- function(trainingData) {
  UIMatrix <- Matrix(0, nrow = max(trainingData$UserID),
                        ncol = max(trainingData$MovieID), sparse = TRUE);
  UIMatrix[cbind(trainingData$UserID,
                 trainingData$MovieID)] <- trainingData$Rating;
  return(UIMatrix);
}