dplyr中等价于df[duplicated(df[,subset]),]的实现方法
寻找与基础R去重语句等价的dplyr写法
需求:找到和基础R代码 df[duplicated(df[,subset]),] 等价的dplyr写法,该代码的作用是基于指定的subset列识别重复组,保留每组中除首个匹配行之外的所有重复行。
先说明:显示所有重复行的代码(包含首行)
你提到的这段代码会筛选出所有属于重复组的行(包括每组的第一行),但并非我们要的目标结果:
df %>% filter(n() > 1, .by = col)
正确的等价写法
方法1:使用.by参数(dplyr 1.1.0及以上版本推荐)
无需显式分组,语法更简洁,且保留原数据行顺序:
df %>% filter(row_number() > 1, .by = subset)
方法2:显式分组写法(兼容旧版dplyr)
通过group_by指定分组列,筛选时保留每组第2行及以后的记录,最后取消分组状态避免影响后续操作:
df %>% group_by(subset) %>% filter(row_number() > 1) %>% ungroup()
你提到的SQL风格写法优化
你想到的贴近SQL风格的写法是可行的,只需将col替换为实际的subset列,建议加上ungroup()清理分组:
# 替换subset为实际列名;若要基于所有列,旧版dplyr可用group_by_all(),新版推荐group_by(across(everything())) df %>% group_by(subset) %>% filter(row_number() > 1) %>% ungroup()
内容的提问来源于stack exchange,提问作者qwr
相关产品推荐
相关产品推荐

