使用dplyr对分组变量过滤未生效的问题求助
dplyr对分组变量过滤未生效的问题求助
嘿,我来帮你排查这个问题!你现在遇到的过滤不生效的问题,核心是逻辑条件的设计完全不符合你的需求,咱们一步步拆解来看:
为什么你的原代码不起作用?
你写的过滤条件是:
filter(CPTCode != 33975 | CPTCode != 33976 | CPTCode != 33935 | CPTCode != 33945)
这个条件是对每一行做判断的——只要某一行满足任意一个!=的条件,就会保留这行。比如对于RunId=1的患者,他的第一行CPT是33975,虽然不满足CPTCode !=33975,但它满足CPTCode !=33976,所以这行会被保留;第二行是10436,满足所有!=条件,也会被保留。最终整个分组都被留了下来,完全达不到“排除有特定CPT的患者”的目的。
正确的过滤方式
你的需求是:排除所有在任意一行包含目标CPT代码的患者,也就是只保留那些所有行的CPT都不在目标列表里的患者。这里需要用分组级别的逻辑判断(all()或any()),而不是逐行判断:
方法1:用all()判断分组内所有CPT都不在目标列表
library(tibble) library(dplyr) data <- tribble( ~RunId, ~CPTCode, 1, 33975, 1, 10436, 2, 33976, 2, 10436, 3, 33935, 3, 10436, 4, 33945, 4, 10436, 5, 10436 ) data2 <- data %>% group_by(RunId) %>% filter(all(!CPTCode %in% c(33975, 33976, 33935, 33945))) %>% ungroup() # 记得取消分组,避免后续操作受影响
方法2:用any()的否定,判断分组内不存在目标CPT
data2 <- data %>% group_by(RunId) %>% filter(!any(CPTCode %in% c(33975, 33976, 33935, 33945))) %>% ungroup()
方法3:先找出要排除的患者ID,再反选(更直观)
如果你觉得分组判断有点绕,也可以先提取所有包含目标CPT的患者ID,再排除这些ID的所有行:
# 先获取所有需要排除的RunId exclude_runids <- data %>% filter(CPTCode %in% c(33975, 33976, 33935, 33945)) %>% pull(RunId) %>% unique() # 过滤掉这些ID的所有行 data2 <- data %>% filter(!RunId %in% exclude_runids)
以上三种方法运行后,data2都会和你期望的desired_data完全一致。
备注:内容来源于stack exchange,提问作者John Ryan
相关产品推荐
相关产品推荐

