首页 > 解决方案 > 用行中上一个日期的下一个日期填充日期列

问题描述

我必须在数据框中填写一个日期列,在最后一个日期添加一天,然后到最后(添加一天)。它没有填补缺失的日期,因为从最后一个日期开始没有更多的日期,所以没有间隙。

还有更多列,但为了示例,让我们保持简单。

df <- structure(list(dates = c("1991-01-01", "1991-01-02", "1991-01-03", 
NA, NA, NA)), row.names = c(NA, 6L), class = c("tbl_df", "tbl", 
"data.frame"))

# A tibble: 6 x 1
  dates     
* <chr>     
1 1991-01-01
2 1991-01-02
3 1991-01-03
4 NA        
5 NA        
6 NA 

我知道我可以用序列(seq.Date)代替它来填充它,但我想前段时间我在某处读过一个优雅的函数,用于使用最后日期和滞后来填充向量。

预期结果:

# A tibble: 6 x 1
  dates     
* <chr>     
1 1991-01-01
2 1991-01-02
3 1991-01-03
4 1991-01-04   
5 1991-01-05        
6 1991-01-06   

类似于zoo::na.locf()但考虑到我事先不知道“从”和“到”的日期

任何提示?

标签: rdatedataframedplyrzoo

解决方案


另一种dplyr可能性tidyr可能是:

df %>%
 mutate(dates = as.Date(dates, format = "%Y-%m-%d")) %>%
 fill(dates) %>%
 mutate(dates = if_else(duplicated(dates), 
                        dates + cumsum(duplicated(dates)), 
                        dates))

  dates     
  <date>    
1 1991-01-01
2 1991-01-02
3 1991-01-03
4 1991-01-04
5 1991-01-05
6 1991-01-06

或仅涉及的可能性dplyr

df %>%
 mutate(dates = as.Date(dates, format = "%Y-%m-%d"),
        dates = if_else(is.na(dates),
                        last(na.omit(dates)) + cumsum(is.na(dates)),
                        dates))

推荐阅读