【问题标题】:Longitudinal dataset - difference between two dates纵向数据集 - 两个日期之间的差异
【发布时间】:2020-12-20 01:25:52
【问题描述】:

我有一个纵向数据集,我从 Excel 导入到 R 中,如下所示:

STUDYID  VISIT#  VISITDate 
1         1      2012-12-19
1         2      2018-09-19
2         1      2013-04-03
2         2      2014-05-14
2         3      2016-05-12

在此数据集中,每个患者/研究 ID 有不同的医院就诊次数,他们的首次就诊日期可能因人而异。我想创建一个新的时间变量,它基本上是自首次访问以来的年数,因此数据集将如下所示:

STUDYID  VISIT#  VISITDate   Time(years)
1         1      2012-12-19    0
1         2      2018-09-19    5
2         1      2013-04-03    0
2         2      2014-05-14    1
2         3      2016-05-12    3

创建这样一个时间变量的原因是为了评估随时间变化的差异回归效应(这是一个连续变量)。有没有办法在 R 中创建一个像这样的新时间变量,以便我可以在回归分析中将其用作自变量?

【问题讨论】:

    标签: r time longitudinal


    【解决方案1】:

    考虑ave 以STUDYID 组计算VISITDate 的最小值,然后取日期差并转换为整数年:

    df <- within(df, {
            minVISITDate <- ave(VISITDate, STUDYID, FUN=min)
            Time <- floor(as.double(difftime(VISITDate, minVISITDate, unit="days") / 365))
            rm(minVISITDate)
        })
    
    df
    #  STUDYID VISIT#  VISITDate Time
    # 1      1      1 2012-12-19    0 
    # 2      1      2 2018-09-19    5 
    # 3      2      1 2013-04-03    0
    # 4      2      2 2014-05-14    1 
    # 5      2      3 2016-05-12    3
    

    【讨论】:

    • 我是否需要在 RStudio 中为此代码安装一些包?另外,由于我的数据集经过了几轮过滤,现在位于“mydata”下,您提出的代码是否如下所示:mydata
    • 是的,将所有 df 实例更改为您的实际数据框名称。不,你不需要额外的包来运行这个解决方案。
    【解决方案2】:

    加载包:

    library(tibble)
    library(dplyr)
    library(lubridate)
    

    设置数据:

    dat <- tribble(~STUDYID , ~VISIT , ~VISITDate ,
                   1       ,  1    ,  "2012-12-19",
                   1       ,  2    ,  "2018-09-19",
                   2       ,  1    ,  "2013-04-03",
                   2       ,  2    ,  "2014-05-14",
                   2       ,  3    ,  "2016-05-12") %>% 
      mutate(VISITDate = as.Date(VISITDate)) 
    

    创建想要的变量:

    dat %>% 
      group_by(STUDYID) %>% 
      mutate(Time = first(VISITDate) %--% VISITDate,
             Time = as.numeric(Time, "years")) %>% 
      ungroup()
    
    # A tibble: 5 x 4
      STUDYID VISIT VISITDate   Time
        <dbl> <dbl> <date>     <dbl>
    1       1     1 2012-12-19  0   
    2       1     2 2018-09-19  5.75
    3       2     1 2013-04-03  0   
    4       2     2 2014-05-14  1.11
    5       2     3 2016-05-12  3.11
    

    【讨论】:

    • 这些似乎只适用于特定日期。我有一整列的 VISITDate 所以似乎不可能为每一行编写代码。您是否会进行修改以允许整个日期列?谢谢。
    • 它已经这样做了。如果您遇到的数据错误未在您提供的数据中显示,请使用新数据编辑您的问题,以便我了解为什么会出现不同的行为。
    猜你喜欢
    • 2011-10-29
    • 1970-01-01
    • 2014-02-12
    • 2015-09-14
    • 2015-06-21
    • 2020-02-06
    • 2023-04-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多