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

长格式抗菌药物耐药性数据中跨行条件对比(Row wise conditional comparisons)的实现方法咨询

长格式抗菌药物耐药性数据中跨行条件对比(Row wise conditional comparisons)的实现方法咨询

我最近在处理抗菌药物耐药性数据时遇到了一个问题:偶尔会出现两种本应结果一致的抗生素,其敏感/耐药状态不匹配的情况。比如在下面的示例数据中,OXA(苯唑西林)和FLC(氟氯西林)的结果应该始终保持一致,但第一个样本的结果就不匹配,第二个是匹配的。这种情况几乎可以肯定是重复测试时的数据录入错误,所以这类样本需要被排除。

另外我还需要注意:不要把NA识别为不匹配,因为有时候这两种抗生素只会检测其中一种。

我现在能想到的方法是把数据转成宽格式进行条件检查,再转回长格式,但我想知道有没有办法直接在长格式下完成这种跨行的条件对比,不用来回转格式?

library(dplyr)
library(tidyr)

df <- tribble(
  ~id, ~organism, ~antibiotic, ~sensitivity,
  1, "Staph aureus", "OXA", "Resistant",
  1, "Staph aureus", "FLC", "Sensitive",
  2, "Staph aureus", "OXA", "Resistant",
  2, "Staph aureus", "FLC", "Resistant",
  3, "Staph aureus", "OXA", NA,
  3, "Staph aureus", "FLC", "Sensitive"
)

其实在长格式下处理这个需求完全没问题,用dplyr的分组和窗口函数就能搞定,不用来回折腾格式。我给你两种实用的实现思路:

方法一:纯长格式分组处理

这种方法全程在长格式下操作,通过分组提取对应抗生素的结果来判断匹配性:

df_cleaned <- df %>%
  # 按样本ID和菌种分组,确保我们对比的是同一个样本的同一种菌
  group_by(id, organism) %>%
  # 先筛选出我们关注的两种抗生素(如果数据里还有其他抗生素的话)
  filter(antibiotic %in% c("OXA", "FLC")) %>%
  mutate(
    # 提取当前组内OXA的结果,用na.omit和first确保拿到非NA值
    oxa_result = first(na.omit(if_else(antibiotic == "OXA", sensitivity, NA_character_))),
    # 提取当前组内FLC的结果
    flc_result = first(na.omit(if_else(antibiotic == "FLC", sensitivity, NA_character_))),
    # 判断是否存在不匹配:两个结果都非NA且不等则标记为TRUE
    is_mismatch = !is.na(oxa_result) & !is.na(flc_result) & oxa_result != flc_result
  ) %>%
  # 过滤掉存在不匹配的整个样本组
  filter(!any(is_mismatch)) %>%
  # 清理临时生成的辅助列,回到原数据结构
  select(-oxa_result, -flc_result, -is_mismatch) %>%
  ungroup()

方法二:分组内临时转宽(更直观)

如果觉得纯长格式的逻辑有点绕,也可以在分组内部临时转宽做判断,再转回长格式——这种方式只在小组内操作,不会影响全局数据结构,逻辑更清晰:

df_cleaned <- df %>%
  group_by(id, organism) %>%
  filter(antibiotic %in% c("OXA", "FLC")) %>%
  # 分组内临时转宽,把两种抗生素的结果拆成列
  pivot_wider(names_from = antibiotic, values_from = sensitivity) %>%
  # 保留符合要求的样本:有任意一个NA,或者两个结果一致
  filter(is.na(OXA) | is.na(FLC) | OXA == FLC) %>%
  # 转回长格式,同时自动丢弃NA值(如果只测了一种抗生素)
  pivot_longer(cols = c(OXA, FLC), names_to = "antibiotic", values_to = "sensitivity", values_drop_na = TRUE) %>%
  ungroup()

两种方法都能达到你的需求:既排除了两种抗生素结果不匹配的样本,又保留了只测其中一种的样本,而且不需要全局来回转格式~

备注:内容来源于stack exchange,提问作者Ollie

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.17 11:24:42