这可以在没有任何循环的情况下完成。它适用于以下功能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