首页 > 解决方案 > 考虑时间序列数据中的零

问题描述

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

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

标签: rdplyrtime-series

解决方案


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

library(dplyr)

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

2) zoo由于这是一个时间序列,因此可以通过使用时间序列表示来简化许多计算。转换为 zoo 对象z,我们可以使用这种从 zoo 转换为 ts 并返回的单线,它具有插入 NA 值的效果。由于 ts 类不能直接表示日期,我们使用聚合转换回日期,然后使用 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)

推荐阅读