从表到缺失值

时间:2017-06-26 10:40:16

标签: r

在下面的数据框中,有许多连续几天缺少值。 我想创建一个显示缺失天数的表

预期输出

缺失值表

from            to 
2012-01-08      2012-01-12
2012-01-18      2012-01-22
2012-01-29      2012-02-01

我尝试使用此代码

library(dplyr)
df$Date <- as.Date(df$Date, format = "%d-%b-%Y")
from_to_table_NA <- df %>% 
  dplyr::filter(is.na(value)) %>% 
  dplyr::summarise(from = min(Date),
                   to =   max(Date))
> from_to_table_NA
        from         to
1 2012-01-08 2012-02-01

正如预期的那样,它只给出了缺失值的最小最大日期。我将非常感谢有关如何获得所需输出的任何建议。

数据

df <- read.table(text = c("
Date          value
5-Jan-2012  5
6-Jan-2012  2
7-Jan-2012  3
8-Jan-2012  NA
9-Jan-2012  NA
10-Jan-2012 NA
11-Jan-2012 NA
12-Jan-2012 NA
13-Jan-2012 4
14-Jan-2012 5
15-Jan-2012 5
16-Jan-2012 7
17-Jan-2012 5
18-Jan-2012 NA
19-Jan-2012 NA
20-Jan-2012 NA
21-Jan-2012 NA
22-Jan-2012 NA
23-Jan-2012 12
24-Jan-2012 5
25-Jan-2012 7
26-Jan-2012 8
27-Jan-2012 8
28-Jan-2012 10
29-Jan-2012 NA
30-Jan-2012 NA
31-Jan-2012 NA
1-Feb-2012  NA
2-Feb-2012  12"), header =T)

1 个答案:

答案 0 :(得分:3)

您需要连续几天分组。这可以通过获得天数之间的差异不完全为1的条件的累积总和来完成:

df %>% 
  filter(is.na(value)) %>% 
  group_by(g = cumsum(coalesce(Date - lag(Date), 1) != 1)) %>% 
  summarise(from = min(Date),
            to =   max(Date))

给出:

# A tibble: 3 x 3
      g       from         to
  <int>     <date>     <date>
1     0 2012-01-08 2012-01-12
2     1 2012-01-18 2012-01-22
3     2 2012-01-29 2012-02-01