【问题标题】:Selecting rows that meet a condition depending on other rows in R根据R中的其他行选择满足条件的行
【发布时间】:2019-09-20 13:35:16
【问题描述】:

我正在使用 R 来识别疾病的事件案例。每位患者多年来多次就诊(数据框的每一行是一次就诊),并且要被标记为“事件”,就诊必须满足以下标准:

  • 感染测试必须为阳性(感染 == “是”)
  • 该患者在过去两年中尚未出现感染“阳性”

我的数据如下所示:

我想创建一个新变量来指示每次访问是否为事件感染病例。例如,输出应如下所示:

正如所见,患者可能不止一次发生事故。任何时候他们的感染测试呈阳性,并且在过去两年内没有再次感染测试呈阳性,都被视为事件。

我找不到在 R 中获取此输出的有效方法。可以使用 dplyr 完成吗?非常感谢您对此的任何帮助。

【问题讨论】:

  • 请提供可复制粘贴格式的数据,而不是图像。使用dput(head(df,n)) 提供样本数据。还要添加已经失败的内容,包括预期的行为。

标签: r date dplyr data-manipulation


【解决方案1】:

一种方法是计算感染事件之间的时间差 (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     

【讨论】:

    猜你喜欢
    • 2016-08-31
    • 1970-01-01
    • 2019-04-24
    • 1970-01-01
    • 2023-01-25
    • 1970-01-01
    • 2022-07-30
    • 1970-01-01
    • 2020-06-10
    相关资源
    最近更新 更多