如何在不转宽格式的情况下用dplyr筛选符合条件的长格式数据?
用dplyr实现需求(无需转换数据格式)
当然可以用dplyr轻松完成这个任务,完全不需要把长格式转成宽格式!这里有两种简单易懂的实现方式:
方法一:分组筛选(一步到位)
直接按患者ID分组,然后只保留那些存在第1天RRT=0记录的患者的所有数据:
library(dplyr) # 加载你的原始数据 subject <- c(1,1,1,2,2,3,3,3) day <- c(1,2,3,1,2,1,2,3) RRT <- c(0,0,1,1,0,0,1,1) SOFA <- c(8,9,2,10,12,11,19,8) libo <- data.frame(subject,day,RRT,SOFA) # 执行筛选 libodesired <- libo %>% group_by(subject) %>% filter(any(day == 1 & RRT == 0)) %>% ungroup()
代码逻辑说明:
group_by(subject):把数据按患者ID分组,这样我们可以针对每个患者的所有记录单独做判断filter(any(day == 1 & RRT == 0)):在每个患者的分组里,检查是否存在「第1天且RRT=0」的记录。只要符合这个条件,就保留该患者的全部行数据ungroup():取消分组,让结果回到常规的数据框格式
方法二:分步筛选(更直观)
如果你觉得分步操作更容易理解,可以先提取符合条件的患者ID,再用这个列表筛选所有数据:
# 第一步:获取第1天RRT=0的患者ID列表 valid_subjects <- libo %>% filter(day == 1 & RRT == 0) %>% pull(subject) # 第二步:筛选这些患者的所有记录 libodesired <- libo %>% filter(subject %in% valid_subjects)
代码逻辑说明:
pull(subject):把筛选后的患者ID提取成一个独立的向量subject %in% valid_subjects:只保留ID在有效列表里的患者的所有数据
两种方法得到的结果完全匹配你的期望,输出的libodesired就是你想要的目标数据集。
内容的提问来源于stack exchange,提问作者alexandreliborio
相关产品推荐
相关产品推荐

