在R中筛选dataframe中ID出现次数大于1的所有对应行的问题
你之前的代码不生效是因为duplicated()函数默认仅会将某个值第二次及之后出现的位置标记为TRUE,首次出现的重复ID对应行仍会被标记为FALSE,因此只能得到重复ID的部分行,无法保留全部。
以下是两种常用的正确实现方式:
基础R实现(无需额外安装包)
方法1:按ID频次筛选
先统计每个ID的出现次数,筛选出次数大于1的ID,再保留所有对应行,逻辑最直观:
d_sub <- subset(d, ID %in% names(which(table(d$ID) > 1)))
方法2:双向重复标记
通过正、倒序两次调用duplicated(),将所有属于重复ID的行全部标记为TRUE:
d_sub <- subset(d, duplicated(d$ID) | duplicated(d$ID, fromLast = TRUE))
两种方法对万行级别数据集的运行效率无明显差异,按需选择即可。
dplyr实现(可读性更高,适合tidyverse技术栈)
按ID分组后筛选组内行数大于1的所有记录,方便后续衔接其他数据处理操作:
library(dplyr) d_sub <- d %>% group_by(ID) %>% filter(n() > 1) %>% ungroup() # 不需要保留分组时可加上,避免影响后续操作
运行上述任意一种代码,都可以得到你预期的、保留所有重复ID对应全部行的d_sub。
内容的提问来源于stack exchange,提问作者logjammin
相关产品推荐
相关产品推荐

