Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 如何提取在一列中满足条件但在另一列上排序的行?_R_Sorting - Fatal编程技术网

R 如何提取在一列中满足条件但在另一列上排序的行?

R 如何提取在一列中满足条件但在另一列上排序的行?,r,sorting,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

我正在编写一个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)?我应该为每个用户的2部电影创建不同的表吗?如果是,怎么做?以下是我的基本算法:

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
}
n:用户数
m:电影的数量
用于(1:nm中的i){

如果(K___i<2&&S__i我并不是说这是唯一的方法,或者说这是一种非常优雅的方法,但这应该是有效的(虽然很难知道,但无法针对稍大的数据集进行测试)。基本方法:首先,创建一个子集,仅包含赞助影片,从原始数据中剪切。将该子集剪切到每个用户的顶级影片。将其追加回非赞助影片数据集。现在从追加的数据集中为每个用户提取前2部影片

> 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
>dat
>海绵非海绵
>spons spons%group\U by(用户)%%>%slice(1)%%
+解组()
> 
>新数据
>新建数据新建数据%group\U by(用户)%%>%slice(1:2)%%
+解组()
>新数据%group\U by(用户)%%>%slice(1:2)%%
+解组()%>%print()
#一个tibble:6x4
用户电影评级赞助
1 2 m5 3.3 0
2 m74 2.6 1
3 6 m74 3.3 1
4.6平方米3.10
5 10 m23 3.4 1
6 10 m3 3.2 0

编辑:我提供的代码不起作用,部分原因是我尝试使用dplyr,但对该软件包没有太多经验。这是一个更黑客的解决方案,但它可以与提供的数据一起工作。

您能提供一个示例输出吗?输出将是一个表格,每个用户只包含前10个用户电影。如果您包含一个简单的wi,则更容易帮助您可用于测试和验证可能的解决方案的示例输入和所需输出。您希望上述输入的确切输出是什么。示例数据中甚至没有用户有10部电影,因此它看起来只会返回全部内容。是的,很抱歉,我只包含了几行数据,但数据约为1000000行,包含2000行usersWell,不要发布你的真实数据。只需发布一个可用于帮助你的最小可复制示例。我们可以假设一个适用于你的样本数据的解决方案将适用于你的真实数据。