如何提取满足条件的一列但又对另一列进行排序的行?

时间:2019-01-07 19:34:42

标签: r sorting

我正在编写一个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
}

请让我知道是否需要进一步澄清。

谢谢

1 个答案:

答案 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时没有太多有关该软件包的经验。这是一种骇客的解决方案,但是可以使用提供的数据。