按月填充NA

时间:2019-12-23 13:41:10

标签: r tidyr

我想按月填写NA。我尝试使用

spring:
  liquibase:
    change-log: classpath:/db/changelog/changelog-master.xml

但是没有用。

我当前的日期如下:

fill(dates,seq.Dates(dates,%m+%)) 

我想要的输出应如下所示:

Desired output

3 个答案:

答案 0 :(得分:5)

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

我对插补包并不精通-其他人可能对此有想法-但对于这样的简单示例而言,这可能会过分地适用。根据日期是否已经存在来分配组,然后沿着这些组进行计数并将其用作要添加多少个月的偏移量。

您的实际输出可以更简洁:您不必保留group列,并且您可能想覆盖date列,而对于演示,我将填写的日期放在单独的列中。 / p>

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

答案 1 :(得分:2)

这是基本的R解决方案

> dout
        dates
1  2019-02-01
2  2019-03-01
3  2019-04-01
4  2019-05-01
5  2019-06-01
6  2019-02-05
7  2019-03-05
8  2019-04-05
9  2019-05-05
10 2019-02-09

如此

{{1}}

答案 2 :(得分:0)

涉及dplyrtidyrlubridate的另一个选项可能是:

dates %>%
 fill(dates) %>%
 group_by(rleid = group_indices(., dates)) %>%
 mutate(dates = ymd(dates) + months(1:n()-1)) %>%
 ungroup() %>%
 select(-rleid)

   dates     
   <date>    
 1 2019-02-01
 2 2019-03-01
 3 2019-04-01
 4 2019-05-01
 5 2019-06-01
 6 2019-02-05
 7 2019-03-05
 8 2019-04-05
 9 2019-05-05
10 2019-02-09