如何基于组内恒定变量的最大值筛选指定数量分组的数据集?
解决分组数据集筛选Top N用户的问题
你遇到的问题在于用group_by(id)后调用top_n,这是在每个用户组内部筛选行,但每个用户的n_visits都是恒定的,所以每个组里的所有行都被保留了,自然得到全部数据。我们需要的是先筛选出n_visits最高的前2个用户,再保留这些用户的所有数据,具体方案如下:
方法一:分步筛选(清晰直观)
先提取每个用户的唯一id和对应的n_visits(因为每个用户的n_visits不变,去重即可),然后选出前2个用户的id:
# 提取Top 2用户的id top_users <- da %>% distinct(id, n_visits) %>% # 获取每个用户的唯一访问次数记录 top_n(2, n_visits) %>% # 选出访问次数最高的2个用户 pull(id) # 提取id向量 # 筛选原数据中这些用户的所有行 da %>% filter(id %in% top_users)
方法二:合并为一步(更简洁)
可以把两步合并成一个链式操作,避免中间变量:
da %>% filter( id %in% ( da %>% distinct(id, n_visits) %>% top_n(2, n_visits) %>% pull(id) ) )
方法三:使用slice_max(dplyr新版本推荐)
如果你的dplyr版本较新,推荐用slice_max替代top_n(top_n已被标记为软弃用),逻辑完全一致:
da %>% filter( id %in% ( da %>% distinct(id, n_visits) %>% slice_max(n_visits, n = 2) %>% pull(id) ) )
最终输出结果
不管用哪种方法,都会得到你期望的结果:
id n_visits 1 1 3 2 1 3 3 1 3 4 2 2 5 2 2 6 2 2
内容的提问来源于stack exchange,提问作者Scijens
相关产品推荐
相关产品推荐

