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

R语言如何按ID列配对规则结合Sex列值筛选数据框行

R语言按ID配对规则筛选数据实现

现有数据

构造测试数据集的代码:

data <- data.frame(ID = c("1a", "1b", "2a", "2b", "3a", "4b", "5a", "5b"),
           Sex = c(1, 2, 2, 1, 1, 2, 1, 2))

原始数据内容:

ID Sex
 1a   1
 1b   2
 2a   2
 2b   1
 3a   1
 4b   2
 5a   1
 5b   2

筛选规则

  • 提取ID字段中的数字部分作为配对分组依据,同数字带不同a/b后缀的ID属于同一配对组
  • 配对组存在2条对应记录(即同数字的a、b后缀ID同时存在):仅保留组内Sex = 1的行
  • 配对组仅存在1条记录(无对应配对ID):保留组内所有行,不限制Sex取值
    预期筛选结果:
ID Sex
 1a   1
 2b   1
 3a   1
 4b   2
 5a   1

实现代码

无额外依赖的Base R写法

不需要安装任何第三方包,直接运行即可:

# 提取ID中的数字部分生成配对组标识
data$pair_id <- gsub("[^0-9]", "", data$ID)
# 统计每个配对组的样本量
pair_n <- table(data$pair_id)

# 分别筛选有配对、无配对的样本
res_paired <- data[data$pair_id %in% names(pair_n[pair_n == 2]) & data$Sex == 1, ]
res_unpaired <- data[data$pair_id %in% names(pair_n[pair_n == 1]), ]

# 合并结果并删除临时列
final_data <- rbind(res_paired, res_unpaired)
final_data$pair_id <- NULL

运行后输出的final_data和预期结果完全一致。

dplyr简洁写法

如果日常用tidyverse生态处理数据,可以用更精简的管道操作实现:

library(dplyr)

final_data <- data %>%
  mutate(pair_id = gsub("[^0-9]", "", ID)) %>%
  group_by(pair_id) %>%
  # 组内样本量为2时保留Sex=1的行,否则全部保留
  filter(if (n() == 2) Sex == 1 else TRUE) %>%
  ungroup() %>%
  select(-pair_id)

内容的提问来源于stack exchange,提问作者Drew

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 05:42:25