R 按组填写缺失的日期

R 按组填写缺失的日期,r,dplyr,missing-data,R,Dplyr,Missing Data,在我的数据中,有些ID在几个月内存在观察结果,而其他ID则没有,例如 dat <- data.frame(c(1, 1, 1, 2, 3, 3, 3, 4, 4, 4), c(rep(30, 2), rep(25, 5), rep(20, 3)), c('2017-01-01', '2017-02-01', '2017-04-01', '2017-02-01', '2017-01-01', '2017-02-01', '2017-03-01', '2017-01-01',

在我的数据中,有些ID在几个月内存在观察结果,而其他ID则没有,例如

dat <- data.frame(c(1, 1, 1, 2, 3, 3, 3, 4, 4, 4), c(rep(30, 2), rep(25, 5), rep(20, 3)), c('2017-01-01', '2017-02-01', '2017-04-01', '2017-02-01', '2017-01-01', '2017-02-01', '2017-03-01', '2017-01-01',
                    '2017-02-01', '2017-04-01'))
colnames(dat) <- c('id', 'value', 'date')
dat
tidyr::complete()
适用于给定示例数据的情况:

library(tidyverse)
dat %>% 
  group_by(id) %>% 
  complete(date) %>% 
  ungroup()

      id date       value
   <dbl> <fct>      <dbl>
 1  1.00 2017-01-01  30.0
 2  1.00 2017-02-01  30.0
 3  1.00 2017-03-01  NA  
 4  1.00 2017-04-01  25.0
 5  2.00 2017-01-01  NA  
 6  2.00 2017-02-01  25.0
 7  2.00 2017-03-01  NA  
 8  2.00 2017-04-01  NA  
 9  3.00 2017-01-01  25.0
10  3.00 2017-02-01  25.0
11  3.00 2017-03-01  25.0
12  3.00 2017-04-01  NA  
13  4.00 2017-01-01  20.0
14  4.00 2017-02-01  20.0
15  4.00 2017-03-01  NA  
16  4.00 2017-04-01  20.0
库(tidyverse)
dat%>%
分组依据(id)%>%
完成日期%>%
解组()
id日期值
1  1.00 2017-01-01  30.0
2  1.00 2017-02-01  30.0
3 1.00 2017-03-01北美
4  1.00 2017-04-01  25.0
5.2.00 2017-01-01不适用
6  2.00 2017-02-01  25.0
7.2.00 2017-03-01北美
8.2.00 2017-04-01北美
9  3.00 2017-01-01  25.0
10  3.00 2017-02-01  25.0
11  3.00 2017-03-01  25.0
12.3.00 2017-04-01北美
13  4.00 2017-01-01  20.0
14  4.00 2017-02-01  20.0
15.4.00 2017-03-01北美
16  4.00 2017-04-01  20.0

这里有一种方法可以使用
展开.grid
合并

dat <- data.frame(c(1, 1, 1, 2, 3, 3, 3, 4, 4, 4), c(rep(30, 2), rep(25, 5), rep(20, 3)), as.Date(c('2017-01-01', '2017-02-01', '2017-04-01', '2017-02-01', '2017-01-01', '2017-02-01', '2017-03-01', '2017-01-01',
                                                                                            '2017-02-01', '2017-04-01')))
colnames(dat) <- c('id', 'value', 'date')

date_range <- seq(min(as.Date(dat$date)), max(as.Date(dat$date)), by = 'months')

dat_expanded <- expand.grid(date_range, dat$id)

colnames(dat_expanded) <- c("date", "id")

result <- merge(dat, dat_expanded, by=c("id", "date"), all.y = T)
dat
tidyr::complete()
填充缺少的值 添加
id
date
作为要展开的列(

library(tidyverse)

complete(dat, id, date)


# A tibble: 16 x 3
      id date       value
   <dbl> <date>     <dbl>
 1  1.00 2017-01-01  30.0
 2  1.00 2017-02-01  30.0
 3  1.00 2017-03-01  NA  
 4  1.00 2017-04-01  25.0
 5  2.00 2017-01-01  NA  
 6  2.00 2017-02-01  25.0
 7  2.00 2017-03-01  NA  
 8  2.00 2017-04-01  NA  
 9  3.00 2017-01-01  25.0
10  3.00 2017-02-01  25.0
11  3.00 2017-03-01  25.0
12  3.00 2017-04-01  NA  
13  4.00 2017-01-01  20.0
14  4.00 2017-02-01  20.0
15  4.00 2017-03-01  NA  
16  4.00 2017-04-01  20.0
库(tidyverse)
完成(日期、id、日期)
#一个tibble:16 x 3
id日期值
1  1.00 2017-01-01  30.0
2  1.00 2017-02-01  30.0
3 1.00 2017-03-01北美
4  1.00 2017-04-01  25.0
5.2.00 2017-01-01不适用
6  2.00 2017-02-01  25.0
7.2.00 2017-03-01北美
8.2.00 2017-04-01北美
9  3.00 2017-01-01  25.0
10  3.00 2017-02-01  25.0
11  3.00 2017-03-01  25.0
12.3.00 2017-04-01北美
13  4.00 2017-01-01  20.0
14  4.00 2017-02-01  20.0
15.4.00 2017-03-01北美
16  4.00 2017-04-01  20.0

这就是您想要的吗?这是可行的,但它比需要的要复杂一些。您只需提供
id
date
作为列,以便在
complete
中展开,并避免分组和取消分组。