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

如何在不转宽格式的情况下用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 06:46:43