长格式抗菌药物耐药性数据中跨行条件对比(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
相关产品推荐
相关产品推荐

