r - 根据R中的其他行选择满足条件的行
问题描述
我在 R 中工作以识别疾病的事件病例。每位患者多年来多次就诊(数据框的每一行是一次就诊),并且要被标记为“事件”,就诊必须满足以下标准:
- 感染测试必须为阳性(感染 == “是”)
- 该患者在过去两年中尚未对感染呈“阳性”
我的数据如下所示:
我想创建一个新变量,指示每次访问是否是事件感染病例。例如,输出应如下所示:
如所见,患者可能不止一次发生事故。任何时候他们的感染测试呈阳性并且在过去两年中也没有再次进行阳性感染测试,他们被认为是事件。
我找不到在 R 中获取此输出的有效方法。可以使用 dplyr 完成吗?将不胜感激任何帮助。
解决方案
一种方法是计算感染事件之间的时间差(event_diff
)。然后,incident
当这个差异大于 2 年或差异为 0 时(假设多个测试不在同一日期进行)。现在看这个,我怀疑有更好的替代解决方案。
df <- data.frame(
patient_id = c(1,1,1,1,1,1,2,2,2,2),
infection = c("no", "yes", "yes", "no", "yes", "yes", "yes", "no", "no", "yes"),
date = c("2005-02-22", "2005-04-26", "2005-05-06", "2006-05-22", "2007-08-19", "2007-12-15", "2005-10-24", "2005-11-11", "2006-07-12", "2007-12-01")
)
df$date <- as.Date(df$date, "%Y-%m-%d")
library(dplyr)
df %>%
group_by(patient_id, infection) %>%
mutate(event_diff = coalesce(date - lag(date), 0)) %>%
mutate(incident = ifelse(infection == "yes" & (event_diff == 0 | event_diff > (365*2)), "yes", "no"))
patient_id infection date event_diff incident
<dbl> <fct> <date> <drtn> <chr>
1 1 no 2005-02-22 0 days no
2 1 yes 2005-04-26 0 days yes
3 1 yes 2005-05-06 10 days no
4 1 no 2006-05-22 454 days no
5 1 yes 2007-08-19 835 days yes
6 1 yes 2007-12-15 118 days no
7 2 yes 2005-10-24 0 days yes
8 2 no 2005-11-11 0 days no
9 2 no 2006-07-12 243 days no
10 2 yes 2007-12-01 768 days yes
推荐阅读
- django - 如何在 Django 模板中正确包含 SVG 精灵表
- google-cloud-platform - 来自 Google Cloud Platform VM 的 Youtube API 错误“已超出未验证使用的每日限制。继续使用需要注册”
- reactjs - reactJs 安全存储
- logic - 说任何带有“Softmax 函数”一词的问题都是重复的副本是否正确?
- android - Appium Espresso 后门
- postgresql - 如何从解释中获取 Postgresql 总成本时间
- ios - 删除并重新安装应用后,iOS 钥匙串数据会保留吗?
- ruby-on-rails - Rails 范围使用实例方法
- pandas - 多索引列上的熊猫,fillna
- python - 如何在我的烧瓶网络应用程序中实现动态 select2 字段?