计算时间序列数据中的零

时间:2019-05-08 00:21:38

标签: r dplyr time-series

嗨,我正在将我的当前数据集转换为时间序列,方法是将其划分为几周并计算每星期的计数。例如,当前计数为零的周在数据集中被省略。以下是示例数据集。我也想将所有零周都包括在内。如何使用dplyr进行转换。

2013-10-6 1
2014-08-03 1
2014-10-12 1

2 个答案:

答案 0 :(得分:1)

1)dplyr 假设输入DF在末尾的注释中可重复显示,将DF连接到几周的数据帧,然后将NA值替换为零。在value末尾的Note中的数据帧中,它是整数,但如果在您的应用程序中为double,则使用0代替0L。

library(dplyr)

DF %>%
   right_join(data.frame(date = seq(first(.$date), last(.$date), 7))) %>%
   mutate(value = coalesce(value, 0L))

2)动物园由于这是一个时间序列,因此可以使用时间序列表示简化许多计算。转换为动物园对象z时,我们可以使用这种单线转换,将动物园转换为ts并转换为ts,然后转换为插入NA值。由于ts类不能直接表示日期,因此我们使用聚合将其转换回Date,然后使用na.fill将NA替换为0。

library(zoo)
z <- read.zoo(DF, frequency = 7)

na.fill(aggregate(as.zoo(as.ts(z)), as.Date, c), 0)

这也可以写成:

library(magrittr)

z %>% as.ts %>% as.zoo %>% aggregate(as.Date, c) %>% na.fill(0)

注意

Lines <- "2013-10-6 1
2014-08-03 1
2014-10-12 1"
DF <- read.table(text = Lines, col.names = c("date", "value"))
DF$date <- as.Date(DF$date)

答案 1 :(得分:1)

我们可以使用complete包中的full_seqtidyr

library(dplyr)
library(tidyr)

dat2 <- dat %>%
  mutate(V1 = as.Date(V1)) %>%
  complete(V1 = full_seq(V1, period = 7), fill = list(V2 = 0))
dat2
# # A tibble: 54 x 2
#    V1            V2
#    <date>     <dbl>
#  1 2013-10-06     1
#  2 2013-10-13     0
#  3 2013-10-20     0
#  4 2013-10-27     0
#  5 2013-11-03     0
#  6 2013-11-10     0
#  7 2013-11-17     0
#  8 2013-11-24     0
#  9 2013-12-01     0
# 10 2013-12-08     0
# # ... with 44 more rows

数据

dat <- read.table(text = "'2013-10-6' 1
'2014-08-03' 1
                  '2014-10-12' 1",
                  header = FALSE, stringsAsFactors = FALSE)