首页 > 解决方案 > 创建生存分析数据集

问题描述

我有一个由三列组成的表:ID、开放日期和取消日期。

在此处输入图像描述

我想做的是为每个客户创建 36 个观察值(3 年每月一次)作为虚拟变量。基本上,我希望取消日期之前的所有月份观察结果为 1,其他月份为 0。如果取消日期为空,则所有值均为 1。

应为每个 ID 重复此过程。

所需的输出将是一个包含五列的表格:ID、开放日期、取消日期、月份(从 1 到 36,从开放日期开始)和状态(1 或 0)。

在此处输入图像描述

我已经尝试了一切,但没有设法解决这个问题,使用 seq() 创建日期并对其进行排序seq(table$Opening, by = "month", length.out = 36)以及许多其他方式。

标签: r

解决方案


我们可以使用completefromtidyr为每个 1 个月的序列创建一个日期,为每个组ID创建一个row_number作为 count ofMonth和 create Statusbased on Cancellation_Date

library(dplyr)
library(tidyr)

df %>%
  mutate_at(vars(ends_with("Date")), as.Date, "%d/%m/%y") %>%
  mutate(Date = Opening_Date) %>%
  group_by(ID) %>%
  complete(Date = seq(Date,by = "1 month", length.out = 36)) %>%
  mutate(Month = row_number()) %>%
  fill(Opening_Date, Cancellation_Date) %>%
  mutate(Status = +(Date <= Cancellation_Date))

#      ID Date       Opening_Date Cancellation_Date Month Status
#   <dbl> <date>     <date>       <date>            <int>  <int>
# 1   336 2017-01-01 2017-01-01   2018-06-01            1      1
# 2   336 2017-02-01 2017-01-01   2018-06-01            2      1
# 3   336 2017-03-01 2017-01-01   2018-06-01            3      1
# 4   336 2017-04-01 2017-01-01   2018-06-01            4      1
# 5   336 2017-05-01 2017-01-01   2018-06-01            5      1
# 6   336 2017-06-01 2017-01-01   2018-06-01            6      1
# 7   336 2017-07-01 2017-01-01   2018-06-01            7      1
# 8   336 2017-08-01 2017-01-01   2018-06-01            8      1
# 9   336 2017-09-01 2017-01-01   2018-06-01            9      1
#10   336 2017-10-01 2017-01-01   2018-06-01           10      1
# … with 26 more rows

在输出Date列中是每个 的每月日期序列,ID如果不需要,可以从最终输出中删除。

数据

df <- data.frame(ID = 336, Opening_Date = '1/1/17',Cancellation_Date = '1/6/18')

推荐阅读