【问题标题】:Remove all the prior rows if there consecutive missing dates are found如果发现连续缺失的日期,则删除所有先前的行
【发布时间】:2021-06-08 03:37:02
【问题描述】:

在下面的 data.table 中,我正在尝试识别连续丢失超过 4 天/行的组,如果找到,删除这些连续丢失日期之前的所有行。以下是一个小样本集,其中 B 组有一些缺失的行。

library(data.table)
dt <- structure(list(date = structure(c(17956L, 17959L, 17960L, 17961L, 
                                  17962L, 17963L, 17966L, 17967L, 17968L, 17969L, 17970L, 17973L, 
                                  17974L, 17975L, 17976L, 17977L, 17980L, 17981L, 17982L, 17983L, 
                                  17984L, 17956L, 17959L, 17960L, 17961L, 17962L, 17963L, 17966L, 
                                  17967L, 17968L, 17980L, 17981L, 17982L, 17983L, 17984L), class = c("IDate", "Date")), 
               group = c("A", "A", "A", "A", "A", 
                          "A", "A", "A", "A", "A", "A", "A", "A", 
                          "A", "A", "A", "A", "A", "A", "A", "A", 
                          "B", "B", "B", "B", "B", "B", "B", "B", 
                          "B", "B", "B", "B", "B", "B"), 
               value = c(43.7425, 
                         43.9625, 43.8825, 43.63, 43.125, 43.2275, 44.725, 45.2275, 45.4275, 
                         45.9325, 46.53, 47.005, 46.6325, 47.04, 48.7725, 47.7625, 47.185, 
                         46.6975, 47.1175, 47.18, 47.4875, 12.31, 12.51, 12.7, 12.4, 12.63, 
                         12.93, 13.18, 13.23, 13.35, 14.27, 14.5, 14.25, 13.88, 13.71)), 
          row.names = c(NA, -35L), class = c("data.table", "data.frame"))
> dt
          date group   value
 1: 2019-03-01     A 43.7425
 2: 2019-03-04     A 43.9625
 3: 2019-03-05     A 43.8825
 4: 2019-03-06     A 43.6300
 5: 2019-03-07     A 43.1250
 6: 2019-03-08     A 43.2275
 7: 2019-03-11     A 44.7250
 8: 2019-03-12     A 45.2275
 9: 2019-03-13     A 45.4275
10: 2019-03-14     A 45.9325
11: 2019-03-15     A 46.5300
12: 2019-03-18     A 47.0050
13: 2019-03-19     A 46.6325
14: 2019-03-20     A 47.0400
15: 2019-03-21     A 48.7725
16: 2019-03-22     A 47.7625
17: 2019-03-25     A 47.1850
18: 2019-03-26     A 46.6975
19: 2019-03-27     A 47.1175
20: 2019-03-28     A 47.1800
21: 2019-03-29     A 47.4875
22: 2019-03-01     B 12.3100
23: 2019-03-04     B 12.5100
24: 2019-03-05     B 12.7000
25: 2019-03-06     B 12.4000
26: 2019-03-07     B 12.6300
27: 2019-03-08     B 12.9300
28: 2019-03-11     B 13.1800
29: 2019-03-12     B 13.2300
30: 2019-03-13     B 13.3500
31: 2019-03-25     B 14.2700 <------ Missing days prior to 25th March in group B
32: 2019-03-26     B 14.5000
33: 2019-03-27     B 14.2500
34: 2019-03-28     B 13.8800
35: 2019-03-29     B 13.7100

我想确定 B 组有超过 4 个连续缺失的日期/行,并删除这些缺失日期之前的所有行。

如果连续缺失的日期/行少于 4 天,那么我们不需要隔离这些组。

谢谢!

【问题讨论】:

  • “缺失”是什么意思,您的日期列没有缺失 (NA) 行?
  • 我已更新问题以显示缺失的日期。

标签: r date data.table


【解决方案1】:

编写一个函数,如果观察到行,则删除直到缺失日期的行。

remove_rows <- function(date) {
  inds <- diff(date) > 4
  if(any(inds)) (which.max(inds) + 1):length(date) else seq_along(date)
}

并为每个组应用此功能。

library(data.table)
dt[, .SD[remove_rows(date)], group]

#    group       date   value
# 1:     A 2019-03-01 43.7425
# 2:     A 2019-03-04 43.9625
# 3:     A 2019-03-05 43.8825
# 4:     A 2019-03-06 43.6300
# 5:     A 2019-03-07 43.1250
# 6:     A 2019-03-08 43.2275
# 7:     A 2019-03-11 44.7250
# 8:     A 2019-03-12 45.2275
# 9:     A 2019-03-13 45.4275
#10:     A 2019-03-14 45.9325
#11:     A 2019-03-15 46.5300
#12:     A 2019-03-18 47.0050
#13:     A 2019-03-19 46.6325
#14:     A 2019-03-20 47.0400
#15:     A 2019-03-21 48.7725
#16:     A 2019-03-22 47.7625
#17:     A 2019-03-25 47.1850
#18:     A 2019-03-26 46.6975
#19:     A 2019-03-27 47.1175
#20:     A 2019-03-28 47.1800
#21:     A 2019-03-29 47.4875
#22:     B 2019-03-25 14.2700
#23:     B 2019-03-26 14.5000
#24:     B 2019-03-27 14.2500
#25:     B 2019-03-28 13.8800
#26:     B 2019-03-29 13.7100
#    group       date   value

【讨论】:

    【解决方案2】:

    dplyr 方法

    dt %>% group_by(group) %>%
      filter(!(cumsum(c(0, diff.Date(date)) >=4) == 0 & !max(cumsum(c(0, diff.Date(date)) >=4)) == 0))
    
             date group   value
    1  2019-03-01     A 43.7425
    2  2019-03-04     A 43.9625
    3  2019-03-05     A 43.8825
    4  2019-03-06     A 43.6300
    5  2019-03-07     A 43.1250
    6  2019-03-08     A 43.2275
    7  2019-03-11     A 44.7250
    8  2019-03-12     A 45.2275
    9  2019-03-13     A 45.4275
    10 2019-03-14     A 45.9325
    11 2019-03-15     A 46.5300
    12 2019-03-18     A 47.0050
    13 2019-03-19     A 46.6325
    14 2019-03-20     A 47.0400
    15 2019-03-21     A 48.7725
    16 2019-03-22     A 47.7625
    17 2019-03-25     A 47.1850
    18 2019-03-26     A 46.6975
    19 2019-03-27     A 47.1175
    20 2019-03-28     A 47.1800
    21 2019-03-29     A 47.4875
    22 2019-03-25     B 14.2700
    23 2019-03-26     B 14.5000
    24 2019-03-27     B 14.2500
    25 2019-03-28     B 13.8800
    26 2019-03-29     B 13.7100
    
    

    或类似的baseR方法

    subset(dt, 
           as.logical(ave(as.numeric(dt$date), 
                          dt$group, 
                          FUN = function(x){as.numeric(!(cumsum(c(0, diff(x)) >=4) == 0 & !max(cumsum(c(0, diff(x)) >=4)) == 0)) != 0})))
    
             date group   value
    1  2019-03-01     A 43.7425
    2  2019-03-04     A 43.9625
    3  2019-03-05     A 43.8825
    4  2019-03-06     A 43.6300
    5  2019-03-07     A 43.1250
    6  2019-03-08     A 43.2275
    7  2019-03-11     A 44.7250
    8  2019-03-12     A 45.2275
    9  2019-03-13     A 45.4275
    10 2019-03-14     A 45.9325
    11 2019-03-15     A 46.5300
    12 2019-03-18     A 47.0050
    13 2019-03-19     A 46.6325
    14 2019-03-20     A 47.0400
    15 2019-03-21     A 48.7725
    16 2019-03-22     A 47.7625
    17 2019-03-25     A 47.1850
    18 2019-03-26     A 46.6975
    19 2019-03-27     A 47.1175
    20 2019-03-28     A 47.1800
    21 2019-03-29     A 47.4875
    31 2019-03-25     B 14.2700
    32 2019-03-26     B 14.5000
    33 2019-03-27     B 14.2500
    34 2019-03-28     B 13.8800
    35 2019-03-29     B 13.7100
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-21
      • 2019-10-18
      相关资源
      最近更新 更多