在R中使用dplyr查找供体与受者列不匹配值的实现方法
实现代码
首先构造示例数据并执行匹配逻辑:
library(tidyverse) # 构造示例数据 df <- tribble(~PatientID, ~A1.recipient, ~A2.recipient, ~DonorID, ~A1.donor, ~A2.donor, 101, "1", "3", 201, "3", "1", 102, "1", "2", 202, "2", "68", 103, "68", "69", 203, "2", "3", 104, "1", "2", 204, NA_character_, NA_character_, ) # dplyr 实现逻辑 df_result <- df %>% # 按行分组,逐行处理匹配逻辑 rowwise() %>% mutate( # 提取当前行所有受者等位基因,排除空值 recipient_alleles = list(na.omit(c_across(ends_with(".recipient")))), # 提取当前行所有供体等位基因 donor_alleles = list(c_across(ends_with(".donor"))), # 筛选出供体中不在受者列表里的错配值,排除空值 mismatches = list(na.omit(donor_alleles[!donor_alleles %in% recipient_alleles])), # 按顺序拆分错配值到两列,不足的位置补NA A1.mismatch = mismatches[1], A2.mismatch = mismatches[2] ) %>% # 取消行分组 ungroup() %>% # 删除中间辅助列 select(-recipient_alleles, -donor_alleles, -mismatches)
逻辑说明
- 用
rowwise()开启行级操作,保证每一行的匹配判断互不干扰 c_across()是dplyr 1.0.0之后推出的、和across配套的行方向取值函数,正好适配你想使用across相关语法的需求,可以批量提取指定列的行内值合并为向量,比手动拼接列更灵活,即使后续受者/供体列数增加也不需要修改逻辑- 过滤掉供体中存在于受者列表中的值后,按供体的原有顺序排列错配值,长度不足2的位置自动补NA,和你给出的期望输出完全一致
内容的提问来源于stack exchange,提问作者Nick Brown
相关产品推荐
相关产品推荐

