我想按月填写NA。我尝试使用
fill(dates,seq.Dates(dates,%m+%))
但是没有用。
我当前的日期如下:
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")
我想要的输出应如下所示:
最佳答案
首先,就像我上面提到的,您的日期实际上不是日期,它们是您需要转换的因素。
我对插补包并不精通-其他人可能对此有想法-但对于这样的简单示例而言,这可能是过分的。根据日期是否已存在来分配组,然后沿着这些组进行计数并将其用作要添加多少个月的偏移量。
您的实际输出可能更简洁:您不必保留group列,并且可能要覆盖date列,而对于演示,我将填写的日期放在单独的列中。
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
编辑添加:我采用了第二种方法,您可以改为计算每个日期有多少个观测值,然后对序列进行列表,然后将其嵌套。我不认为这会更好,而且也更令人费解(特别是必须两次
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