仅在以后期间按ID扩展

时间:2016-09-18 23:17:16

标签: r dplyr tidyr

是否有办法根据ID填写未来日期的隐式缺失?

例如,想象一下从2016年1月开始的实验。我有3个参与者在不同时期加入。主题1在1月加入我并继续留到8月.Subj 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"))

我尝试使用expand中的tidyrTimeFill DataCombine来自{{1}},但这些方法的问题是我会在参与者加入之前得到日期实验。在这个特定的例子中,我只希望在参与者退出实验的情况下填写句点。

1 个答案:

答案 0 :(得分:1)

complete中的tidyr函数用于将隐式缺失值转换为显式缺失值。我们将不得不做一些过滤,不包括过去完成。最简单的方法似乎是在具有起始值的表上进行连接:

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_number。问题是complete会重新排列数据。

P.S。请注意,您的示例dput具有空系数级别(""),因此我先将其过滤掉。