2017-06-26 27 views
1

在下面的數據框中,有許多缺少值的連續天數。 我想創建一個表,其中顯示缺少的天缺失值從表到缺失值

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 

做正如預期的那樣,它給了我只有缺失值的最小日期。我將非常感謝有關如何獲得所需輸出的任何建議。

DATA

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) 

回答

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 
+4

類似的一個:'DF%>% 突變(%)%>% filter(is.na(value))%>% =最後(日期))' – mt1022

+0

@ mt1022,這是一個很好的。 – Axeman

+2

主要想法是一樣的。 'cumsum'在分析NAS的分組時非常有用。 – mt1022