如何根据下一个开始日期计算结束日期R,并将数据重塑为日期计数/时间序列?

问题描述

再次从这里开始

我一直在寻找关于stackoverflow的答案,但没有成功

如果您知道在线教程,该教程解释了我应该/如何解决这些问题,我很想听听。

数据

test <- structure(list(record_id = c(110032,110032,110321,110321),start_fu = structure(c(16302,16302,17308,17308),class = "Date"),end_fu = structure(c(17033,17033,17828,17828),start_course = structure(c(16301,17307,16355,16325,16344,16499,17824),course = structure(c(0,1,3,5,0),class = c("haven_labelled","vctrs_vctr","double"))),row.names = c(NA,-9L),groups = structure(list(
    record_id = c(110032,.rows = structure(list(c(1L,2L,5L,6L,7L,8L),c(3L,4L,9L)),ptype = integer(0),class = c("vctrs_list_of","list"))),row.names = 1:2,class = c("tbl_df","tbl","data.frame"),.drop = TRUE),class = c("grouped_df","tbl_df","data.frame"))

解释和变量

因此,我从多个记录中收集了后续数据。现在,我正在显示两个记录。在后续过程中,这些人可以切换课程。该课程的开始日期已经记录。

  • record_id =单个唯一ID
  • start_fu =开始跟踪
  • end_fu =随访结束
  • start_course =课程的开始日期
  • course =哪门课程开始

问题1

我想创建一个名为stop_course的变量。 这是根据下一个课程的start_course计算的。 (开始课程-1天) 如果没有下一个课程,则应基于end_fu日期。

预期输出1

| record_id | start_fu   | end_fu     | start_course | course | stop_course |
|-----------|------------|------------|--------------|--------|-------------|
|    110032 | 2014-08-20 | 2016-08-20 | 2014-08-19   | 0      | 2014-08-19  |
|    110032 | 2014-08-20 | 2016-08-20 | 2014-08-20   | 1      | 2014-09-11  |
|    110032 | 2014-08-20 | 2016-08-20 | 2014-09-12   | 3      | 2014-09-30  |
|    110032 | 2014-08-20 | 2016-08-20 | 2014-10-01   | 0      | 2014-10-11  |
|    110032 | 2014-08-20 | 2016-08-20 | 2014-10-12   | 5      | 2014-03-04  |
|    110032 | 2014-08-20 | 2016-08-20 | 2015-03-05   | 3      | 2016-08-20  |
|    110321 | 2017-05-22 | 2018-10-24 | 2017-05-21   | 3      | 2017-05-21  |
|    110321 | 2017-05-22 | 2018-10-24 | 2017-05-22   | 3      | 2018-10-19  |
|    110321 | 2017-05-22 | 2018-10-24 | 2018-10-20   | 0      | 2018-10-24  |

问题2 最后,我想为每个record_id创建一个包含其课程的日常列表。 因此:创建一个变量day_count

预期输出2

| record_id | day_count | date       | course |
|-----------|-----------|------------|--------|
|    110032 | 0         | 2014-08-19 | 0      |
|    110032 | 1         | 2014-08-20 | 1      |
|    110032 | 2         | 2014-08-21 | 1      |
|       ... | ...       | ...        | ...    |
|    110032 | 24        | 2014-09-12 | 3      |
|    110032 | 25        | 2013-09-13 | 3      |
|       ... | ...       | ...        | ...    |

希望您可以帮助我进行编码或为我提供一些很好的教程

体重 KB

解决方法

在这里使用dplyrtidyr是一种方法:

我们可以使用lead来获取start_course的下一个日期,并从中减去1天,其中default的值是last中每个{{ {1}}。然后,我们可以创建一个从第一个日期到最后一个日期的序列,end_fu的值record_id,并创建一个fill列。

course