1

協調フィルタリングの問題に取り組んでいますが、生データをユーザー評価マトリックスに再形成するのに問題があります。'movie'、'user'、'rating'の列を持つ評価データベースが与えられます。このデータベースから、サイズ#users x #moviesのマトリックスを取得したいと思います。ここで、各行はユーザーの評価を示します。

最小限の作業例を次に示します。

# given this:
ratingDB <- data.frame(rbind(c(1,1,1),c(1,2,NA),c(1,3,0), c(2,1,1), c(2,2,1), c(2,3,0), 
                         c(3,1,NA), c(3,2,NA), c(3,3,1)))
names(ratingDB) <- c('user', 'movie', 'liked')

#how do I get this?
userRating <- matrix(data = rbind(c(1,NA,0), c(1,1,0), c(NA,NA,1)), nrow=3)

2つのforループを使用して問題を解決できますが、これはもちろんうまくスケーリングしません。誰かがベクトル化されたソリューションで私を助けることができますか?

4

1 に答える 1

3

これはループなしで実行できます。それは関数で動作しますmatrix

# sort the 'liked' values (this is not neccessary for the example data)
vec <- with(ratingDB, liked[order(user, movie)])

# create a matrix
matrix(vec, nrow = length(unique(ratingDB$user)), byrow = TRUE)

     [,1] [,2] [,3]
[1,]    1   NA    0
[2,]    1    1    0
[3,]   NA   NA    1

これにより、に格納されているベクトルratingDB$likedが行列に変換されます。引数byrow = TRUEを使用すると、データを行に配置できます(デフォルトは列によるものです)。


NA更新:ケースがデータフレームにない場合はどうすればよいですか? (@steffenによるコメントを参照)

まず、NA:を含む行を削除します。

subDB <- ratingDB[complete.cases(ratingDB), ]

  user movie liked
1    1     1     1
3    1     3     0
4    2     1     1
5    2     2     1
6    2     3     0
9    3     3     1

完全なデータフレームを再構築できます。この関数は、とexpand.gridのすべての組み合わせを生成するために使用されます。usermovie

full <- setNames(with(subDB, expand.grid(sort(unique(user)), sort(unique(movie)))),
                 c("user", "movie"))

  movie user
1     1    1
2     2    1
3     3    1
4     1    2
5     2    2
6     3    2
7     1    3
8     2    3
9     3    3

これで、サブデータフレームsubDBと完全な組み合わせデータフレームの情報を次の関数fullと組み合わせることができます。merge

ratingDB_2 <- merge(full, subDB, all = TRUE)

  user movie liked
1    1     1     1
2    1     2    NA
3    1     3     0
4    2     1     1
5    2     2     1
6    2     3     0
7    3     1    NA
8    3     2    NA
9    3     3     1

結果は元のマ​​トリックスと同じです。したがって、同じ手順を適用して、liked値のマトリックスに変換できます。

matrix(ratingDB_2$liked, nrow = length(unique(ratingDB_2$user)), byrow = TRUE)

     [,1] [,2] [,3]
[1,]    1   NA    0
[2,]    1    1    0
[3,]   NA   NA    1
于 2013-02-05T02:40:08.987 に答える