抱歉无望的头衔..
我有一个看起来像这样的数据集:
|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电影.
如果你有几个用户和几部电影,你可能很容易在构建一个内存时耗尽内存matrix.比如说用户是1000而不同的电影是1000.你最终会得到一个matrix包含1M条目的条目,其中大部分都会丢失(因为不是每个用户都看过每部电影).
如果您的数据集很大,那么可以sparseMatrix从Matrix包中获取数据集.如果用户和电影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.