【发布时间】:2020-07-30 21:18:04
【问题描述】:
我有一个包含 51 列、id 和 50 对宽格式的开始日期和结束日期的表格。我想将其转换为带有开始和结束日期的长格式。下面给出的示例代码仅适用于 2 对开始日期和结束日期。还必须在“end”的结尾和“start”的开头之间插入新行。此外,每个 id 应该有两行从 'pre' 到第一个开始日期和另一行,从最后一个结束日期到每个 id 的 'post'。另请注意,end2 可能与 post 相同。
library(data.table)
table1 <- fread("
id pre post start1 end1 start2 end2 var1
A 01/01/1992 12/31/1992 03/15/1992 03/20/1992 03/25/1992 03/30/1992 1
C 04/01/1992 06/30/1992 05/28/1992 06/30/1992 NA NA 5
D 05/01/1992 06/01/1992 NA NA NA NA NA
E 07/18/1992 08/02/1992 07/15/1992 07/22/1992 NA NA 1
F 06/02/1992 09/03/1992 07/15/1992 07/17/1992 07/20/1992 09/10/1992 2" )
cols <- c("pre","post","start1", "end1","start2", "end2")
table1[, (cols) := lapply(.SD, as.Date, format="%m/%d/%Y"), .SDcols=cols]
Final table should be-
id start end var1
A 01/01/1992 03/14/1992 -99
A 03/15/1992 03/20/1992 1
A 03/21/1992 03/24/1992 -99
A 03/25/1992 03/30/1992 1
A 04/01/1992 12/31/1992 -99
C 04/01/1992 05/27/1992 -99
C 05/28/1992 06/30/1992 5
D 05/01/1992 06/01/1992 NA
E 07/18/1992 07/22/1992 NA
E 07/23/1992 08/02/1992 1
F 06/02/1992 07/14/1992 2
F 07/15/1992 07/17/1992 2
F 07/18/1992 07/19/1992 2
F 07/20/1992 09/03/1992 2
更正我的原始帖子:我发现在我的数据中,对于某些 ID,pre 和 post 日期可能不会分别出现在 start1 和 end2 之前和之后。我在上面添加了 3 个额外的 ID 作为示例。也就是说,提前日期可能介于 start1 和 end1 或 end1 和 start1 之间。同样,发布日期可能位于时间线上的任何位置,但会在发布日期之后。最终数据应以 pre 开头并以 post 结尾,保留所有行的开始和结束范围,某些情况下某些 ID 的第一行和最后一行除外。
【问题讨论】:
-
我很难理解如何从
table1进入你的决赛桌。您提到了多对start和end日期列。但是您的示例数据也有一个pre和post列,它们以某种方式集成到您的最终表格中。如何?为什么决赛桌第一行的日期是01/01/1992(id=A是pre)和03/14/1992(table1中没有匹配的条目)?为什么有些var1值-99。一些var1值似乎会重复(var1 = 1代表id=A出现两次),其他则没有(var1 = 5代表id=B只出现一次)。这里有什么规则? -
pre 和 post 是每个 ID 的整个日期范围的结束点。你可以把它想象成一个序列,pre
标签: r dplyr data.table