如何在R中按col_x分组去重后取col_z最高的5条记录?
问题描述
现有一个名为sorted_df的R数据框,包含col_x、col_y、col_z三列共1200行,已按col_z降序排序。其中:
col_x有6个唯一字符串(如A、B、C等)col_y有800个唯一字符串col_z为1200个唯一浮点数
需求是按col_x分组,选择每组中col_z值最高的5行,且每组内的col_y必须是唯一字符串。但当前代码运行后,同一col_x分组下会出现多条col_y相同的记录(仅col_z值不同),不符合需求。
解决方案
核心思路是先去除col_x+col_y的重复组合(保留每个组合中col_z最大的条目),再按col_x分组取前5个最高col_z的记录。使用dplyr包的代码如下:
# 先去重:每个col_x+col_y组合只保留col_z最大的行,再按col_x分组取前5 top_5_unique <- sorted_df %>% # 按col_x和col_y组合分组,保留每组col_z最大的1行 group_by(col_x, col_y) %>% slice_max(col_z, n = 1) %>% # 回到按col_x分组 group_by(col_x) %>% # 分组内按col_z降序排序 arrange(desc(col_z), .by_group = TRUE) %>% # 取每组前5行 slice(1:5)
代码说明
group_by(col_x, col_y):将数据按col_x(目标分组)和col_y(需要去重的列)的组合进行分组slice_max(col_z, n = 1):在每个组合分组中,仅保留col_z值最大的那一行,彻底消除col_x+col_y的重复情况group_by(col_x):重新切换到按col_x的单独分组arrange(desc(col_z), .by_group = TRUE):确保在每个col_x分组内部,数据按col_z从高到低排序slice(1:5):提取每个col_x分组的前5行,即为每组满足col_y唯一且col_z最高的5条记录
内容的提问来源于stack exchange,提问作者Steven Hill
相关产品推荐
相关产品推荐

