如何筛选epds数据集中epds_score未下降或上升的案例?
解决重复测量数据中筛选分数未下降案例的问题
你的代码核心问题是错误地用位置索引进行跨案例的分数对比,而非针对同一个研究对象的不同访视数据做组内比较。以下是两种可行的解决方案,前提是你的数据集有唯一标识每个案例的字段(假设为id):
方法1:使用dplyr分组筛选(推荐)
通过分组后计算基线分数,再判断组内是否存在后续访视分数未下降的情况:
library(dplyr) # 为每个案例添加基线访视(visitnum.x=1.0)的分数 epds <- epds %>% group_by(id) %>% mutate(baseline_epds = epds_score[visitnum.x == '1.0']) %>% ungroup() # 筛选出存在后续访视分数≥基线的案例的所有数据 non_decreasing_cases <- epds %>% group_by(id) %>% filter(any(epds_score[visitnum.x > '1.0'] >= baseline_epds, na.rm = TRUE)) %>% ungroup() # 若仅需获取符合条件的案例ID列表 non_decreasing_ids <- non_decreasing_cases %>% distinct(id)
方法2:转宽格式后筛选
将长格式数据转为宽格式,直接对比基线与后续访视的分数:
library(reshape2) # 转换为宽格式:每个案例一行,各访视分数作为单独列 epds_wide <- dcast(epds, id ~ visitnum.x, value.var = 'epds_score') # 筛选出任意后续访视分数≥基线的案例 non_decreasing_ids_wide <- epds_wide %>% filter(rowSums(select(., -id, -`1.0`) >= `1.0`, na.rm = TRUE) > 0) # 转回长格式获取完整数据 non_decreasing_cases_wide <- epds %>% filter(id %in% non_decreasing_ids_wide$id)
注意事项
- 如果
visitnum.x是数值类型(而非字符型),请把代码中的'1.0'改为1。 - 若存在访视数据缺失,
na.rm=TRUE参数会忽略缺失值,避免筛选逻辑出错。 - 确保数据集有唯一的
id字段用于区分不同案例,若没有需先确认案例的标识方式。
内容的提问来源于stack exchange,提问作者wendy van der wekken
相关产品推荐
相关产品推荐

