选择满足条件的行取决于R中的其他行

时间:2019-09-20 13:35:16

标签: r date dplyr data-manipulation

我正在R中工作,以识别疾病的突发病例。多年来,每位患者都有多次访问(数据框的每一行都是一次访问),并且要标记为“事件”,访问必须满足以下条件:

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

我的数据如下:

enter image description here

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

enter image description here

如所见,患者可能会发生多次。在过去两年中,只要他们的感染测试呈阳性,而又没有另一个阳性感染测试,则被视为事件。

我找不到在R中获得此输出的有效方法。可以使用dplyr完成吗?希望对此有所帮助。

1 个答案:

答案 0 :(得分: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