用每月序列填充 NA

ban*_*nks 3 r tidyr

我想用每月的序列填充 NA。我试着用

fill(dates,seq.Dates(dates,%m+%)) 
Run Code Online (Sandbox Code Playgroud)

但它没有用。

我目前的日期如下:

dates <- structure(list(dates = structure(c(1L, NA, NA, NA, NA, 2L, NA, 
NA, NA, 3L), .Label = c("2019-02-01", "2019-02-05", "2019-02-09"
), class = "factor")), row.names = c(NA, -10L), class = "data.frame")
Run Code Online (Sandbox Code Playgroud)

我想要的输出应该是这样的:

期望输出

cam*_*lle 5

首先,就像我上面提到的,您的日期实际上并不是日期——它们是您需要转换的因素。

我不精通插补包——其他人可能对这些有想法——但对于像这样的简单例子来说,这可能是过度的。根据日期是否已经存在来分配组,然后沿着这些组计算并将其用作要添加的月份的偏移量。

您的实际输出可以更简洁:您不一定需要保留组列,并且您可能想要覆盖日期列,而为了演示,我已将填写的日期放在单独的列中。

library(dplyr)
library(lubridate)

dates %>%
  mutate(dates = as.Date(dates),
         group = cumsum(!is.na(dates))) %>%
  group_by(group) %>%
  tidyr::fill(dates) %>%
  mutate(filled = dates + months(seq_along(dates) - 1))
#> # A tibble: 10 x 3
#> # Groups:   group [3]
#>    dates      group filled    
#>    <date>     <int> <date>    
#>  1 2019-02-01     1 2019-02-01
#>  2 2019-02-01     1 2019-03-01
#>  3 2019-02-01     1 2019-04-01
#>  4 2019-02-01     1 2019-05-01
#>  5 2019-02-01     1 2019-06-01
#>  6 2019-02-05     2 2019-02-05
#>  7 2019-02-05     2 2019-03-05
#>  8 2019-02-05     2 2019-04-05
#>  9 2019-02-05     2 2019-05-05
#> 10 2019-02-09     3 2019-02-09
Run Code Online (Sandbox Code Playgroud)

编辑添加:我玩弄了第二种方法,您可以通过计算每个日期有多少个观察值,然后为您的序列创建一个列表列,然后取消嵌套。我不认为它更好,而且更复杂(尤其是必须group_by两次),但也许有一个用例。

dates %>%
  mutate(dates = as.Date(dates)) %>%
  tidyr::fill(dates) %>%
  count(dates) %>%
  group_by(dates) %>%
  mutate(filled = list(seq.Date(from = dates, by = "1 month", length.out = n))) %>%
  tidyr::unnest(filled)
# same output as above
Run Code Online (Sandbox Code Playgroud)