これはループなしで実行できます。それは関数で動作します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
のすべての組み合わせを生成するために使用されます。user
movie
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