我正在编写一个R代码,为每个用户选择前2部电影,在这10部电影中,最多有1部是赞助电影。数据根据用户评分进行排序,如下所示:
user movie rating sponsored
10 m23 3.4 1
2 m5 3.3 0
6 m74 3.3 1
10 m3 3.2 0
6 m2 3.1 0
10 m54 3.0 1
6 m13 2.8 0
2 m74 2.6 1
2 m12 2.5 0
现在,由于我通常必须基于评分来排序,而不是与每个用户一起,所以我想知道如何保存每个用户内的电影数量(K = 2)和最大赞助电影数量(S = 1)之类的变量)给每个用户?我应该为每个用户的两部电影创建不同的表吗?如果是的话,怎么办?以下基本上是我的算法:
n: number of users
m: number of movies
for(i in 1:nm){
if(K_u_i < 2 && S_u_i <= 1)
add that movie to top 2 list of that user
}
请让我知道是否需要进一步澄清。
谢谢
答案 0 :(得分:1)
我并不是说这是唯一的方法,或者是一种非常优雅的方法,但是这应该可以工作(尽管很难知道,而无法针对稍大的数据集进行测试)。基本方法:首先,创建一个仅包含赞助电影的子集,将其从原始数据中删除。将子集剪切到每个用户的顶级影片。将其追加回非赞助电影的数据集。现在,从附加的数据集中为每个用户拍摄前两部电影。
> dat<- data.frame(user = c(10, 2, 6, 10, 6, 10, 6, 2, 2),
+ movie = c('m23', 'm5', 'm74', 'm3', 'm2', 'm54', 'm13', 'm74', 'm12'),
+ rating = c(3.4, 3.3, 3.3, 3.2, 3.1, 3.0, 2.8, 2.6, 2.5),
+ sponsored = c(1, 0, 1, 0, 0, 1, 0, 1, 0))
>
> spons <- subset(dat, sponsored == 1)
> non_spons <- subset(dat, sponsored == 0)
>
> spons <- spons[order(spons$user, spons$rating, decreasing = TRUE), ]
> spons <- spons %>% group_by(user) %>% slice(1) %>%
+ ungroup()
>
> new_dat <- rbind(spons, non_spons)
>
> new_dat <- new_dat[order(new_dat$user, new_dat$rating, decreasing = TRUE), ]
> new_dat <- new_dat %>% group_by(user) %>% slice(1:2) %>%
+ ungroup()
> new_dat <- new_dat %>% group_by(user) %>% slice(1:2) %>%
+ ungroup() %>% print()
# A tibble: 6 x 4
user movie rating sponsored
<dbl> <fct> <dbl> <dbl>
1 2 m5 3.3 0
2 2 m74 2.6 1
3 6 m74 3.3 1
4 6 m2 3.1 0
5 10 m23 3.4 1
6 10 m3 3.2 0
编辑:我提供的代码无法正常工作,部分原因是我尝试使用dplyr时没有太多有关该软件包的经验。这是一种骇客的解决方案,但是可以使用提供的数据。