R - Fill missing dates by group

后端 未结 3 1671
囚心锁ツ
囚心锁ツ 2020-11-30 14:16

In my data, there exist observations for some IDs in some months and not for others, e.g.

dat <- data.frame(c(1, 1, 1, 2, 3, 3, 3, 4, 4, 4), c(rep(30, 2),         


        
相关标签:
3条回答
  • 2020-11-30 14:34

    tidyr::complete() fills missing values

    add id and date as the columns (...) to expand for

    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
    
    0 讨论(0)
  • 2020-11-30 14:41

    Here is a way to do it using expand.grid and merge:

    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)
    
    0 讨论(0)
  • 2020-11-30 14:42

    tidyr::complete() works given your example data:

    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
    
    0 讨论(0)
提交回复
热议问题