如何在R数据框中保留成对ID数据,排除单例与三例?
高效筛选成对ID的R实现方法
方法一:用tidyverse(dplyr)快速处理
核心思路是按sib_ID分组,只保留组内唯一ID数量恰好为2的行,代码简洁且性能优异:
library(dplyr) df_filtered <- df %>% group_by(sib_ID) %>% filter(n_distinct(ID) == 2) %>% ungroup() # 查看筛选后的数据 df_filtered
group_by(sib_ID):按同胞ID分组,把同属一组的ID归到一起n_distinct(ID):统计每组内的唯一ID数量filter(...):只保留数量为2的组,自动过滤掉单例、三例的组
方法二:用Base R原生实现(无需额外包)
如果不想加载外部包,用原生代码也能高效完成:
# 先统计每个sib_ID对应的唯一ID数量 sib_id_stats <- table(unique(df[, c("ID", "sib_ID")])$sib_ID) # 提取出符合条件的sib_ID(对应2个唯一ID) valid_sibs <- names(sib_id_stats[sib_id_stats == 2]) # 筛选原数据 df_filtered <- df[df$sib_ID %in% valid_sibs, ] # 查看结果 df_filtered
- 先通过
unique去重ID与sib_ID的组合,避免重复统计同一ID - 用
table计数每个sib_ID对应的唯一ID数,再筛选出数量为2的项 - 最后用
%in%匹配原数据中的有效sib_ID,完成筛选
两种方法都能得到你需要的结果,处理大数据量时dplyr的优化会更有优势,轻量场景下Base R方法更直接。
内容的提问来源于stack exchange,提问作者wooden05
相关产品推荐
相关产品推荐

