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
相关产品推荐
相关产品推荐

