【问题标题】:How do I remove rows based on a range of dates given by values in 2 columns?如何根据 2 列中的值给出的日期范围删除行?
【发布时间】:2021-05-15 01:12:33
【问题描述】:

我有一个包含一系列日期的数据集,需要在新行中填写缺失的日期。 df1 是我正在使用的数据的一个例子,df2 是我设法实现的一个例子(我被卡住了)。 df3 是我想结束的地方!

df1
ID     Date       DateStart     DateEnd
1      2/11/2021  2/11/2021     2/17/2021
1      2/19/2021  2/19/2021     2/21/2021
2      1/15/2021  1/15/2021     1/20/2021  
2      1/22/2021  1/22/2021     1/23/2021  

这就是我所在的地方。 NA 不是问题,因为我打算在完成我需要做的事情后删除 DateStart 和 DateEnd 列。这里的问题是我不想包含之前 DateStart 和 DateEnd 范围内的日期。 为了到达这里,我按 ID 分组并填写了df1 中日期之间的缺失日期:

df2
ID     Date       DateStart     DateEnd
1      2/11/2021  2/11/2021     2/17/2021
1      2/12/2021  NA            NA
1      2/13/2021  NA            NA
1      2/14/2021  NA            NA
1      2/15/2021  NA            NA
1      2/16/2021  NA            NA
1      2/17/2021  NA            NA
1      2/18/2021  NA            NA
1      2/19/2021  2/19/2021     2/21/2021
2      1/15/2021  1/15/2021     1/20/2021
2      1/16/2021  NA            NA
2      1/17/2021  NA            NA
2      1/18/2021  NA            NA
2      1/19/2021  NA            NA
2      1/20/2021  NA            NA
2      1/21/2021  NA            NA
2      1/22/2021  NA            NA    
2      1/23/2021  1/23/2021     1/24/2021  

这实际上是我想要的结果:

df3
ID     Date       DateStart     DateEnd
1      2/11/2021  2/11/2021     2/17/2021
1      2/18/2021  NA            NA
1      2/19/2021  2/19/2021     2/21/2021
2      1/15/2021  1/15/2021     1/20/2021
2      1/21/2021  NA            NA
2      1/22/2021  NA            NA    
2      1/23/2021  1/23/2021     1/24/2021  

df3 中填写了缺失的日期,但未填写 DateStart-DateEnd 范围内的日期。

关于如何实现这一目标的任何想法?注意:我有一个包含大量观察的数据集。

【问题讨论】:

  • df1 中,最后 3 个日期是 1/22/2021,1/22/2021, 1/23/2021 。在df3 中,它们是 1/23/2021、1/23/2021、1/24/2021。

标签: r date range tidyverse fill


【解决方案1】:
  • 将日期列转换为日期类。

  • 对于每个ID,使用complete 创建从最小值DateStart 到最大值DateEnd 的日期序列。

  • fill NA 具有先前非 NA 的值,但 Date > DateEnd 除外。

  • 对于每组 IDDateStartDateEnd,保留每组中具有 NA 值或行号 1 的行。

library(dplyr)
library(tidyr)

df %>%
  mutate(across(-ID, lubridate::mdy)) %>%
  group_by(ID) %>%
  complete(Date = seq(min(DateStart), max(DateEnd), by = '1 day')) %>%
  fill(DateStart, DateEnd) %>%
  ungroup %>%
  mutate(across(c(DateStart, DateEnd), ~replace(., Date > DateEnd, NA))) %>%
  group_by(ID, DateStart, DateEnd) %>%
  filter(is.na(DateStart) | row_number() == 1)

#     ID Date       DateStart  DateEnd   
#  <int> <date>     <date>     <date>    
#1     1 2021-02-11 2021-02-11 2021-02-17
#2     1 2021-02-18 NA         NA        
#3     1 2021-02-19 2021-02-19 2021-02-21
#4     2 2021-01-15 2021-01-15 2021-01-20
#5     2 2021-01-21 NA         NA        
#6     2 2021-01-22 NA         NA        
#7     2 2021-01-23 2021-01-23 2021-01-24

数据

df <- structure(list(ID = c(1L, 1L, 2L, 2L), Date = c("2/11/2021", 
"2/19/2021", "1/15/2021", "1/23/2021"), DateStart = c("2/11/2021", 
"2/19/2021", "1/15/2021", "1/23/2021"), DateEnd = c("2/17/2021", 
"2/21/2021", "1/20/2021", "1/24/2021")), 
class = "data.frame", row.names = c(NA, -4L))

【讨论】:

    猜你喜欢
    • 2014-11-04
    • 1970-01-01
    • 2021-01-10
    • 1970-01-01
    • 2020-08-16
    • 2018-04-28
    • 1970-01-01
    • 2016-12-08
    • 1970-01-01
    相关资源
    最近更新 更多