将数据集转换为值矩阵

Ben*_*ing 1 r

抱歉无望的头衔..

我有一个看起来像这样的数据集:

|userId|movieId|rating|genre1|genre2|
|1     |13     |3.5   |1     |0     |
|1     |412    |2.5   |1     |1     |
|2     |4      |3.0   |0     |1     |
|3     |412    |2.5   |1     |1     |
|4     |13     |4.5   |1     |0     |
|4     |412    |5     |1     |1     |
Run Code Online (Sandbox Code Playgroud)

等等...

并非每个用户都对每部电影都进

我想将其转换为一个看起来像这样的矩阵:

|   |1  |2  |3  |4  |
|4  |   |3  |   |   |
|13 |2.5|   |   |4.5|
|412|   |   |   |5  |
Run Code Online (Sandbox Code Playgroud)

所以我有userId作为列,movieId作为行,关联值是给定的评级.

这样做的最佳方法是什么?

编辑:id是非顺序的.有140k用户和28k电影.

nic*_*ola 5

如果你有几个用户和几部电影,你可能很容易在构建一个内存时耗尽内存matrix.比如说用户是1000而不同的电影是1000.你最终会得到一个matrix包含1M条目的条目,其中大部分都会丢失(因为不是每个用户都看过每部电影).

如果您的数据集很大,那么可以sparseMatrixMatrix包中获取数据集.如果用户和电影ID都是顺序​​的(即它们以1开头并以不同条目的数量结束),那么构建它是很简单的.使用@StevenBeaupré data:

require(Matrix)
mat<-sparseMatrix(df$userId,df$movieId,x=df$rating)
Run Code Online (Sandbox Code Playgroud)

如果id不是顺序的:

mat<-sparseMatrix(as.integer(factor(df$userId)), 
                  as.integer(factor(df$movieId)),x=df$rating)
Run Code Online (Sandbox Code Playgroud)

您基本上也可以执行任何matrix操作sparseMatrix.