【问题标题】:how to show an event happened between two dates in R如何在 R 中显示两个日期之间发生的事件
【发布时间】:2015-07-07 16:29:42
【问题描述】:

我的问题似乎很简单,我希望它是。

我有一个数据框,其中包含疾病诊断日期、指示患者服用哪种药物(或暴露和未暴露组)的二元变量、药物的开始和停止日期以及总体停止日期。

ID    Diag_date    Treatment    End.date    Drug.start    drug.end
1        NA           0         15/03/2002   01/01/2002    01/02/2002
1        NA           1         15/03/2002   01/02/2002    01/03/2002
1        NA           0         15/03/2002   01/03/2002    NA
2    01/04/2002       1         01/05/2002   01/01/2015    01/02/2002
2    01/04/2002       0         01/05/2002   01/02/2002    01/03/2002
2    01/04/2002       0         01/05/2002   01/03/2002    NA

如您所见,诊断日期不随时间变化,但药物开始和停止日期是随时间变化的。

最好我想回答两个问题:

1.) 如何将每个ID 的整体End.date 转移到最终drug.end

2.) 如何创建一个二进制列来显示诊断日期是否出现在Drug.startDrug.end 之间的时间间隔内?

我希望我的最终数据如下所示:

ID    Diag_date    Treatment    End.Date     Drug.start    Drug.end    Event
1        NA           0         15/03/2002   01/01/2002    01/02/2002   0
1        NA           1         15/03/2002   01/02/2002    01/03/2002   0
1        NA           0         15/03/2002   01/03/2002    15/03/2002   0 
2    01/04/2002       1         01/05/2002   01/01/2015    01/02/2002   0
2    01/04/2002       0         01/05/2002   01/02/2002    01/03/2002   0
2    01/04/2002       0         01/05/2002   01/03/2002    01/05/2002   1

并非每个人都有诊断日期,因为样本中并非每个人都患有这种疾病。我写的代码如下:

 for (i in 1:nrow(df)) {
   if ((df$Diag_date[i] >= df$Drug.start[i]) && ( df$Diag_date[i] <= df$Drug.stop[i])) {
df$Event[i] <- 1
} else {
df$Event[i] <- 0
  }
}

我运行这段代码时遇到的错误是:

missing value where TRUE/FALSE needed

任何帮助将不胜感激。

【问题讨论】:

  • 非常感谢您的所有意见。我已经标记了我使用的答案,但它们都非常有帮助。

标签: r date intervals


【解决方案1】:

她可能是data.table 等价物

library(data.table)

# Converting to dates
Dates <- names(df)[c(2, 4:6)]
setDT(df)[, (Dates) := lapply(.SD, as.IDate, format = "%d/%m/%Y"), .SDcols = Dates] 

# First question
df[is.na(drug.end), drug.end := End.date] 

# Second question
df[Diag_date >= Drug.start & Diag_date <= drug.end, Event := 1L] 

【讨论】:

    【解决方案2】:

    你可以试试

    library(dplyr)
    df1 %>%
        mutate_each(funs(as.Date(., '%d/%m/%Y')), matches('start|end|date')) %>%
         mutate(drug.end= as.Date(ifelse(is.na(drug.end), End.date, 
                             drug.end),origin='1970-01-01'),
        Event= as.integer((Diag_date >= Drug.start & Diag_date<=drug.end) & 
                            !is.na(Diag_date))) #%>%
        #mutate_each(funs(format(., '%d/%m/%Y')), matches('start|end|date'))
     #    ID  Diag_date Treatment   End.date Drug.start   drug.end Event
     #1  1       <NA>         0 2002-03-15 2002-01-01 2002-02-01     0
     #2  1       <NA>         1 2002-03-15 2002-02-01 2002-03-01     0
     #3  1       <NA>         0 2002-03-15 2002-03-01 2002-03-15     0
     #4  2 2002-04-01         1 2002-05-01 2015-01-01 2002-02-01     0
     #5  2 2002-04-01         0 2002-05-01 2002-02-01 2002-03-01     0
     #6  2 2002-04-01         0 2002-05-01 2002-03-01 2002-05-01     1
    

    正如@David Arenburg 所提到的,最好将“日期”列保留为“日期”类。如果您需要 'character' 格式,只需取消注释最后一行并运行它。

    注意:删除了 group_by,因为它不需要

    【讨论】:

      【解决方案3】:

      Akrun 的回答足以解决手头的问题。建议更直接的代码。

      A <- read.table("clipboard", header = T)
      Dates <- c("Diag_date", "End.date", "Drug.start", "drug.end")
      
      
      A[,Dates] <- lapply(A[,Dates],function(x) as.Date(x, format = "%d/%m/%Y"))
      A$drug.end[is.na(A$drug.end)] <- as.character(A$End.date[is.na(A$drug.end)])
      A$Event <- as.numeric((A$Diag_date >= A$Drug.start & A$Diag_date<=A$drug.end) & !is.na(A$Diag_date))
      

      【讨论】:

        猜你喜欢
        • 2016-06-10
        • 2020-01-31
        • 2016-03-21
        • 1970-01-01
        • 2016-07-29
        • 2020-05-01
        • 2016-11-19
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多