r - 创建生存分析数据集
问题描述
我有一个由三列组成的表:ID、开放日期和取消日期。
我想做的是为每个客户创建 36 个观察值(3 年每月一次)作为虚拟变量。基本上,我希望取消日期之前的所有月份观察结果为 1,其他月份为 0。如果取消日期为空,则所有值均为 1。
应为每个 ID 重复此过程。
所需的输出将是一个包含五列的表格:ID、开放日期、取消日期、月份(从 1 到 36,从开放日期开始)和状态(1 或 0)。
我已经尝试了一切,但没有设法解决这个问题,使用 seq() 创建日期并对其进行排序seq(table$Opening, by = "month", length.out = 36)
以及许多其他方式。
解决方案
我们可以使用complete
fromtidyr
为每个 1 个月的序列创建一个日期,为每个组ID
创建一个row_number
作为 count ofMonth
和 create Status
based 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')
推荐阅读
- python - 如何在图中找到给定 y 值的对应 x 值
- biopython - 如何将 biopython Restriction 包与 REBASE 上的所有酶一起使用?
- kubernetes - 在 Kubernetes 上将 hive4 作为集群运行
- php - 根据识别数据删除重复子数组,分别保留最后出现的重复项
- python - 无法在 Oracle 数据库中保存特定的特殊字符 (ü)
- c# - 每次迭代while循环时如何更改复选框的名称?
- html - Django/Bootstrap - 如何限制每行的块?
- html - 根据屏幕宽度更改引导按钮大小
- azure - 管道中的条件总是触发“对象引用未设置为对象的实例”。
- c++ - 使用 C++ 的 AES 加密和解密。我得到了加密消息的正确输出,但代码无法解密它