R 按小时填写缺失的时间序列

R 按小时填写缺失的时间序列,r,dplyr,time-series,R,Dplyr,Time Series,我有时间序列数据,我想按小时折叠并计数 library(tidyverse) library(lubridate) library(tibbletime) df.have <- data.frame(v1=ymd_hms("2018-01-01 01:00:00", "2018-01-01 01:24:20", "2018-01-01 02:00:00",

我有时间序列数据,我想按小时折叠并计数

library(tidyverse)
library(lubridate)
library(tibbletime)

df.have <- data.frame(v1=ymd_hms("2018-01-01 01:00:00",
                                 "2018-01-01 01:24:20",
                                 "2018-01-01 02:00:00",
                                 "2018-01-01 03:00:00",
                                 "2018-01-01 03:21:20",
                                 "2018-01-01 03:22:20",
                                 #"2018-01-01 04:00:00",
                                 "2018-01-01 05:00:00",
                                 "2018-01-01 06:00:00",
                                 "2018-01-01 06:10:00",
                                 #"2018-01-01 07:00:00",
                                 #"2018-01-01 08:00:00",
                                 "2018-01-01 09:00:00",
                                 "2018-01-02 01:00:00",
                                 "2018-01-02 01:24:20",
                                 "2018-01-02 02:00:00",
                                 "2018-01-02 03:00:00",
                                 "2018-01-02 03:21:20",
                                 "2018-01-02 03:22:20",
                                 #"2018-01-02 04:00:00",
                                 "2018-01-02 05:00:00",
                                 "2018-01-02 06:00:00",
                                 "2018-01-02 06:10:00",
                                 #"2018-01-02 07:00:00",
                                 #"2018-01-02 08:00:00",
                                 "2018-01-02 09:00:00"),
                      v2=c(1, 0, 1, 1, NA, 1, 1, 1, 1, 1,
                           1, 0, 1, 1, NA, 1, 1, 1, 1, 1))

df.have %>%
  as_tbl_time(index = v1) %>%
  collapse_by("hourly", side="start", clean=TRUE) %>%
  group_by(v1) %>%
  mutate(sumv2_byhour = sum(v2, na.rm=TRUE),
         countv1_byhour = n()) %>%
  distinct(v1, .keep_all = TRUE)

# A time tibble: 12 x 4
# Index: v1
# Groups: v1 [12]
   v1                     v2 sumv2_byhour countv1_byhour
   <dttm>              <dbl>        <dbl>          <int>
 1 2018-01-01 01:00:00  1.00         1.00              2
 2 2018-01-01 02:00:00  2.00         2.00              1
 3 2018-01-01 03:00:00  1.00         2.00              3
 4 2018-01-01 05:00:00  3.00         3.00              1
 5 2018-01-01 06:00:00  1.00         2.00              2
 6 2018-01-01 09:00:00  1.00         1.00              1
 7 2018-01-02 01:00:00  1.00         1.00              2
 8 2018-01-02 02:00:00  2.00         2.00              1
 9 2018-01-02 03:00:00  1.00         2.00              3
10 2018-01-02 05:00:00  1.00         1.00              1
11 2018-01-02 06:00:00  4.00         5.00              2
12 2018-01-02 09:00:00  1.00         1.00              1
库(tidyverse)
图书馆(lubridate)
图书馆(藏书时代)
df.have%
按时间(指数=v1)%>%
折叠方式(“每小时”,side=“开始”,clean=TRUE)%>%
分组依据(v1)%>%
变异(sumv2_byhour=sum(v2,na.rm=TRUE),
countv1_byhour=n())%>%
不同(v1,.keep_all=TRUE)
#A时间:12 x 4
#索引:v1
#分组:v1[12]
v1 v2 sumv2_按小时计数v1_按小时计数
1 2018-01-01 01:00:00  1.00         1.00              2
2 2018-01-01 02:00:00  2.00         2.00              1
3 2018-01-01 03:00:00  1.00         2.00              3
4 2018-01-01 05:00:00  3.00         3.00              1
5 2018-01-01 06:00:00  1.00         2.00              2
6 2018-01-01 09:00:00  1.00         1.00              1
7 2018-01-02 01:00:00  1.00         1.00              2
8 2018-01-02 02:00:00  2.00         2.00              1
9 2018-01-02 03:00:00  1.00         2.00              3
10 2018-01-02 05:00:00  1.00         1.00              1
11 2018-01-02 06:00:00  4.00         5.00              2
12 2018-01-02 09:00:00  1.00         1.00              1

到目前为止还不错,但我想对丢失的小时数保持零计数。有没有其他方法可以解决这个问题,让我使用
dplyr::complete

我们可以在
distinct
步骤后
取消分组
,然后执行
complete

df.have %>%
  as_tbl_time(index = v1) %>%
  collapse_by("hourly", side="start", clean=TRUE) %>%
  group_by(v1) %>%
  mutate(sumv2_byhour = sum(v2, na.rm=TRUE),
         countv1_byhour = n()) %>%
  distinct(v1, .keep_all = TRUE) %>%
  ungroup %>%
  complete(v1 = seq(v1[1], v1[length(v1)], by = "1 hour"), 
               fill = list(v2 = 0, sumv2_byhour = 0, countv1_byhour = 0))
# A tibble: 33 x 4
#   v1                     v2 sumv2_byhour countv1_byhour
#   <dttm>              <dbl>        <dbl>          <dbl>
# 1 2018-01-01 01:00:00  1.00         1.00           2.00
# 2 2018-01-01 02:00:00  1.00         1.00           1.00
# 3 2018-01-01 03:00:00  1.00         2.00           3.00
# 4 2018-01-01 04:00:00  0            0              0   
# 5 2018-01-01 05:00:00  1.00         1.00           1.00
# 6 2018-01-01 06:00:00  1.00         2.00           2.00
# 7 2018-01-01 07:00:00  0            0              0   
# 8 2018-01-01 08:00:00  0            0              0   
# 9 2018-01-01 09:00:00  1.00         1.00           1.00
#10 2018-01-01 10:00:00  0            0              0   
# ... with 23 more rows
df.have%>%
按时间(指数=v1)%>%
折叠方式(“每小时”,side=“开始”,clean=TRUE)%>%
分组依据(v1)%>%
变异(sumv2_byhour=sum(v2,na.rm=TRUE),
countv1_byhour=n())%>%
不同(v1,.keep_all=TRUE)%>%
解组%>%
完成(v1=序列(v1[1],v1[长度(v1)],按=“1小时”),
填充=列表(v2=0,sumv2_按小时=0,countv1_按小时=0))
#A tibble:33 x 4
#v1 v2 sumv2_按小时计数v1_按小时计数
#                                   
# 1 2018-01-01 01:00:00  1.00         1.00           2.00
# 2 2018-01-01 02:00:00  1.00         1.00           1.00
# 3 2018-01-01 03:00:00  1.00         2.00           3.00
# 4 2018-01-01 04:00:00  0            0              0   
# 5 2018-01-01 05:00:00  1.00         1.00           1.00
# 6 2018-01-01 06:00:00  1.00         2.00           2.00
# 7 2018-01-01 07:00:00  0            0              0   
# 8 2018-01-01 08:00:00  0            0              0   
# 9 2018-01-01 09:00:00  1.00         1.00           1.00
#10 2018-01-01 10:00:00  0            0              0   
# ... 还有23行

我们可以在
distinct
步骤后
取消分组
,然后执行
完成

df.have %>%
  as_tbl_time(index = v1) %>%
  collapse_by("hourly", side="start", clean=TRUE) %>%
  group_by(v1) %>%
  mutate(sumv2_byhour = sum(v2, na.rm=TRUE),
         countv1_byhour = n()) %>%
  distinct(v1, .keep_all = TRUE) %>%
  ungroup %>%
  complete(v1 = seq(v1[1], v1[length(v1)], by = "1 hour"), 
               fill = list(v2 = 0, sumv2_byhour = 0, countv1_byhour = 0))
# A tibble: 33 x 4
#   v1                     v2 sumv2_byhour countv1_byhour
#   <dttm>              <dbl>        <dbl>          <dbl>
# 1 2018-01-01 01:00:00  1.00         1.00           2.00
# 2 2018-01-01 02:00:00  1.00         1.00           1.00
# 3 2018-01-01 03:00:00  1.00         2.00           3.00
# 4 2018-01-01 04:00:00  0            0              0   
# 5 2018-01-01 05:00:00  1.00         1.00           1.00
# 6 2018-01-01 06:00:00  1.00         2.00           2.00
# 7 2018-01-01 07:00:00  0            0              0   
# 8 2018-01-01 08:00:00  0            0              0   
# 9 2018-01-01 09:00:00  1.00         1.00           1.00
#10 2018-01-01 10:00:00  0            0              0   
# ... with 23 more rows
df.have%>%
按时间(指数=v1)%>%
折叠方式(“每小时”,side=“开始”,clean=TRUE)%>%
分组依据(v1)%>%
变异(sumv2_byhour=sum(v2,na.rm=TRUE),
countv1_byhour=n())%>%
不同(v1,.keep_all=TRUE)%>%
解组%>%
完成(v1=序列(v1[1],v1[长度(v1)],按=“1小时”),
填充=列表(v2=0,sumv2_按小时=0,countv1_按小时=0))
#A tibble:33 x 4
#v1 v2 sumv2_按小时计数v1_按小时计数
#                                   
# 1 2018-01-01 01:00:00  1.00         1.00           2.00
# 2 2018-01-01 02:00:00  1.00         1.00           1.00
# 3 2018-01-01 03:00:00  1.00         2.00           3.00
# 4 2018-01-01 04:00:00  0            0              0   
# 5 2018-01-01 05:00:00  1.00         1.00           1.00
# 6 2018-01-01 06:00:00  1.00         2.00           2.00
# 7 2018-01-01 07:00:00  0            0              0   
# 8 2018-01-01 08:00:00  0            0              0   
# 9 2018-01-01 09:00:00  1.00         1.00           1.00
#10 2018-01-01 10:00:00  0            0              0   
# ... 还有23行

另一种解决方案,它避免使用
dplyr::complete()
,而是使用
padr
包。我觉得这更能说明你想做什么

df.have%>%
按时间(指数=v1)%>%
折叠方式(“每小时”,side=“开始”,clean=TRUE)%>%
分组依据(v1)%>%
变异(sumv2_byhour=sum(v2,na.rm=TRUE),
countv1_byhour=n())%>%
不同(v1,.keep_all=TRUE)%>%
解组()%>%
padr::pad(“小时”)%%>%
padr::按值填充值(值=0)
#>#A tibble:33 x 4
#>v1 v2 sumv2_按小时计数v1_按小时计数
#>                                    
#>  1 2018-01-01 01:00:00    1.           1.2.
#>  2 2018-01-01 02:00:00    1.           1.1.
#>  3 2018-01-01 03:00:00    1.           2.3.
#>  4 2018-01-01 04:00:00    0.           00
#>  5 2018-01-01 05:00:00    1.           1.1.
#>  6 2018-01-01 06:00:00    1.           2.2.
#>  7 2018-01-01 07:00:00    0.           00
#>  8 2018-01-01 08:00:00    0.           00
#>  9 2018-01-01 09:00:00    1.           1.1.
#> 10 2018-01-01 10:00:00    0.           00
#> # ... 还有23行

另一种解决方案,它避免使用
dplyr::complete()
,而是使用
padr
包。我觉得这更能说明你想做什么

df.have%>%
按时间(指数=v1)%>%
折叠方式(“每小时”,side=“开始”,clean=TRUE)%>%
分组依据(v1)%>%
变异(sumv2_byhour=sum(v2,na.rm=TRUE),
countv1_byhour=n())%>%
不同(v1,.keep_all=TRUE)%>%
解组()%>%
padr::pad(“小时”)%%>%
padr::按值填充值(值=0)
#>#A tibble:33 x 4
#>v1 v2 sumv2_按小时计数v1_按小时计数
#>                                    
#>  1 2018-01-01 01:00:00    1.           1.2.
#>  2 2018-01-01 02:00:00    1.           1.1.
#>  3 2018-01-01 03:00:00    1.           2.3.
#>  4 2018-01-01 04:00:00    0.           00
#>  5 2018-01-01 05:00:00    1.