如何用R语言dplyr将聚合的min/max替换为对应电影名称?
问题描述
需按ID分组,生成展示每组最冷门与最热门电影名称的表格,期望样式如下:
| ID | 最冷门电影 | 最热门电影 |
|---|---|---|
| 1 | xyz | rty |
| 2 | zxc | qwz |
目前使用R语言dplyr包的group_by与summarise函数仅能获取popularity的最小、最大值,无法得到对应电影名称,尝试的代码如下:
movies%>% group_by(ID) %>% summarise( Least = min(popularity), Most= max(popularity))
解决方案
方法1:用slice_min/slice_max筛选后整理宽表
先分别提取每组中流行度最低、最高的电影记录,再合并为目标格式:
library(dplyr) library(tidyr) # 提取最冷门电影数据 least_popular <- movies %>% group_by(ID) %>% slice_min(popularity, n = 1, with_ties = FALSE) %>% select(ID, movie_name) %>% rename(最冷门电影 = movie_name) # 提取最热门电影数据 most_popular <- movies %>% group_by(ID) %>% slice_max(popularity, n = 1, with_ties = FALSE) %>% select(ID, movie_name) %>% rename(最热门电影 = movie_name) # 合并成目标表格 result <- least_popular %>% left_join(most_popular, by = "ID")
with_ties = FALSE表示当有多个电影流行度相同时,仅保留第一条;若需保留所有同流行度电影,改为TRUE即可。
方法2:在summarise中直接匹配电影名称
通过which.min/which.max定位流行度极值的索引,直接提取对应电影名:
library(dplyr) result <- movies %>% group_by(ID) %>% summarise( 最冷门电影 = movie_name[which.min(popularity)], 最热门电影 = movie_name[which.max(popularity)] )
注意:若同一ID下存在多个流行度相同的极值电影,此方法仅返回第一个匹配项;如需保留全部,建议使用方法1并调整
with_ties参数。
内容的提问来源于stack exchange,提问作者Misieeek Inv.
相关产品推荐
相关产品推荐

