【发布时间】:2021-08-15 18:23:48
【问题描述】:
我有一个文件记录某人何时生病以及何时康复。有些记录有几起疾病事件,我试图在每一行添加一个新列,即“上次疾病结束的日期”(如果不适用,则为“记录开始的日期”)。有 10,000 条记录,可能有 10 多起疾病事件。但在最简单的例子中,我试图从这个出发:
| ID | RecordBegins | SickStartDate | SickEndDate |
| person1 | 1990-01-01 | 2017-03-04 | 2017-07-01 |
| person1 | 1990-01-01 | 2018-11-01 | 2019-02-04 |
到这里:
| ID | RecordBegins | SickStartDate | SickEndDate | EndLastSick
| person1 | 1990-01-01 | 2017-03-04 | 2017-07-01 | 1990-01-01
| person1 | 1990-01-01 | 2018-11-01 | 2019-02-04 | 2017-07-01
我是 R 新手,并且是自学成才的。我一直试图留在 tidyverse 世界中,但对其他方法持开放态度。
当数据集中只有一个独特的人时,我可以使用下面的代码编写我想要的代码。当我将数据集扩展到多个人时,我尝试使用 group_by() 对其进行扩展,但我想不出一种使它起作用的方法。
sick <-tribble(
~ID, ~RecordBegins, ~SickStartDate, ~SickEndDate,
"person1", as.Date("1990-01-01"), as.Date("2017-03-04"), as.Date("2017-07-01"),
"person1", as.Date("1990-01-01"), as.Date("2018-11-01"), as.Date("2019-02-04"),
)
var1 <- sick$SickEndDate %>% sort(decreasing = TRUE) # place date of last sick at position [1]
var1[1] = sick$`RecordBegins`[1] # replace date of last sick with record start date
var1 <- sort(var1) # re-sort so in date order
sick <- mutate(sick, startExposure = var1)
但是,这感觉很笨拙,当扩展到多人时,我想不出一种方法让它发挥作用,例如:
sick <-tribble(
~ID, ~RecordBegins, ~SickStartDate, ~SickEndDate,
"person1", as.Date("1990-01-01"), as.Date("2017-03-04"), as.Date("2017-07-01"),
"person1", as.Date("1990-01-01"), as.Date("2018-11-01"), as.Date("2019-02-04"),
"person2", as.Date("1995-01-01"), as.Date("2014-10-07"), as.Date("2017-01-04"),
"person2", as.Date("1995-01-01"), as.Date("2017-11-01"), as.Date("2017-11-23"),
)
【问题讨论】: