Учет нулей в данных временных рядов - PullRequest
1 голос
/ 08 мая 2019

Привет! Я преобразовываю свой текущий набор данных во временные ряды, разделяя его на недели и считая каждую неделю. В настоящее время недели, в которых отсчеты равны нулю, например, пропускаются в наборе данных. Ниже приведен пример набора данных. Я хочу также включить все недели с нулями. Как мне преобразовать его, используя dplyr.

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

Ответы [ 2 ]

1 голос
/ 08 мая 2019

Мы можем использовать complete и full_seq из пакета tidyr.

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)
1 голос
/ 08 мая 2019

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 не может представлять даты напрямую, мы используем агрегат для преобразования обратно в 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...