仅为未来期间按 ID 展开

Expand by ID for future periods only

有没有办法根据 id 填充未来日期的隐式缺失?

例如,想象一个在 2016 年 1 月开始的实验。我有 3 个参与者,他们在不同时期加入。受试者 1 在 1 月加入我,并继续待到 8 月。受试者 2 在 3 月加入我,并在实验中待到 8 月。对象 3 也在 3 月加入我,但在 5 月的某个时候退出,因此没有记录 5 月至 8 月期间的观察结果。

请问,受试者3退出实验的日期如何填写?下面是一些模拟数据:

   Subject   Date
1        1 Jan-16
2        1 Feb-16
3        1 Mar-16
4        1 Apr-16
5        1 May-16
6        1 Jun-16
7        1 Jul-16
8        1 Aug-16
9        2 Mar-16
10       2 Apr-16
11       2 May-16
12       2 Jun-16
13       2 Jul-16
14       2 Aug-16
15       3 Mar-16
16       3 Apr-16




structure(list(Subject = c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 
2L, 2L, 2L, 2L, 2L, 3L, 3L), Date = structure(c(5L, 4L, 8L, 2L, 
9L, 7L, 6L, 3L, 8L, 2L, 9L, 7L, 6L, 3L, 8L, 2L), .Label = c("", 
"Apr-16", "Aug-16", "Feb-16", "Jan-16", "Jul-16", "Jun-16", "Mar-16", 
"May-16"), class = "factor")), class = "data.frame", row.names = c(NA, 
-16L), .Names = c("Subject", "Date"))

数据应该是这样的:

   Subject   Date
1        1 Jan-16
2        1 Feb-16
3        1 Mar-16
4        1 Apr-16
5        1 May-16
6        1 Jun-16
7        1 Jul-16
8        1 Aug-16
9        2 Mar-16
10       2 Apr-16
11       2 May-16
12       2 Jun-16
13       2 Jul-16
14       2 Aug-16
15       3 Mar-16
16       3 Apr-16
17       3 May-16
18       3 Jun-16
19       3 Jul-16
20       3 Aug-16

structure(list(Subject = c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 
2L, 2L, 2L, 2L, 2L, 3L, 3L, 3L, 3L, 3L, 3L), Date = structure(c(4L, 
3L, 7L, 1L, 8L, 6L, 5L, 2L, 7L, 1L, 8L, 6L, 5L, 2L, 7L, 1L, 8L, 
6L, 5L, 2L), .Label = c("Apr-16", "Aug-16", "Feb-16", "Jan-16", 
"Jul-16", "Jun-16", "Mar-16", "May-16"), class = "factor")), class = "data.frame", row.names = c(NA, 
-20L), .Names = c("Subject", "Date"))

我尝试使用 tidyr 包中的 expandDataCombine 包中的 TimeFill,但这些方法的问题是我会在参与者之前获得时间段的日期加入了一个实验。在这个特定的例子中,我只希望在参与者退出实验的情况下填充周期。

tidyr 中的 complete 函数旨在将隐式缺失值转换为显式缺失值。我们将不得不进行一些过滤以不包括过去的完成。最简单的方法似乎是在 table 上加入起始值:

library(dplyr)
library(tidyr)

df <- df %>% 
  filter(Date != '') %>% 
  droplevels() %>% 
  group_by(Subject)

df2 <- summarise(df, start = first(Date))

df %>%
  complete(Subject, Date) %>%
  left_join(df2) %>% 
  mutate(Date2 = as.Date(paste0('01-', Date), format = '%d-%b-%y'),
         start = as.Date(paste0('01-', start), format = '%d-%b-%y')) %>% 
  filter(Date2 >= start) %>%
  arrange(Subject, Date2) %>% 
  select(-start, -Date2)

结果:

Source: local data frame [20 x 2]
Groups: Subject [3]

   Subject   Date
     <int> <fctr>
1        1 Jan-16
2        1 Feb-16
3        1 Mar-16
4        1 Apr-16
5        1 May-16
6        1 Jun-16
7        1 Jul-16
8        1 Aug-16
9        2 Mar-16
10       2 Apr-16
11       2 May-16
12       2 Jun-16
13       2 Jul-16
14       2 Aug-16
15       3 Mar-16
16       3 Apr-16
17       3 May-16
18       3 Jun-16
19       3 Jul-16
20       3 Aug-16

我使用日期转换来与开始日期进行可靠比较,但您也许可以以某种方式使用 row_numbers。问题是 complete 会重新排列数据。

p.s。请注意,您的示例 dput 的因子水平为空 (""),因此我先将其过滤掉。