如何用filter()筛选满足2项必选+5项中至少1项的患者数据?
解决方法
你的数据是单指标单行的长格式,直接用filter()逐行判断没法实现“同一患者满足跨行的多个条件”,得换分组聚合的思路,或者转成宽格式再筛选。
长格式数据处理(最常见情况)
假设你的数据框叫lab_data,列是patient_id(患者ID)、test_name(检测指标名)、result(检测结果):
library(tidyverse) # 先定义你的必选和可选指标 required_tests <- c("标准1", "标准2") # 替换成你的2项必选指标名 optional_tests <- c("指标1", "指标2", "指标3", "指标4", "指标5") # 替换成5项可选指标名 # 第一步:筛选出符合条件的患者ID qualified_ids <- lab_data %>% group_by(patient_id) %>% summarise( # 必选条件:2项指标都存在且结果达标(这里用>参考值举例,你换成实际判断逻辑) pass_required = all(required_tests %in% test_name) && all(result[test_name %in% required_tests] > 参考值), # 可选条件:至少1项指标存在且结果达标 pass_optional = any(optional_tests %in% test_name) && any(result[test_name %in% optional_tests] > 参考值), .groups = "drop" ) %>% filter(pass_required & pass_optional) %>% pull(patient_id) # 第二步:用筛选出的ID提取原始数据 final_data <- lab_data %>% filter(patient_id %in% qualified_ids)
宽格式数据处理(如果每个指标是单独一列)
如果你的数据已经是宽格式(比如列是patient_id、标准1、标准2、指标1...指标5),可以直接用filter():
final_data_wide <- wide_lab_data %>% filter( # 必选条件同时满足 标准1 > 参考值1, 标准2 > 参考值2, # 可选条件至少满足1项 (指标1 > 参考值1 | 指标2 > 参考值2 | 指标3 > 参考值3 | 指标4 > 参考值4 | 指标5 > 参考值5) )
注意点
- 把代码里的
参考值、判断符号(>/</==)换成你实际的实验室标准 - 长格式处理时,要确保患者的必选指标都有记录(如果有患者缺某项必选指标,
all(required_tests %in% test_name)会直接排除)
内容的提问来源于stack exchange,提问作者immuen
相关产品推荐
相关产品推荐

