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

在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.10 05:15:03