You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 03:36:00