Rollmean из пакета зоопарка возвращает неожиданные результаты - PullRequest
0 голосов
/ 16 апреля 2020

Я использую этот код:

library(dplyr)
library(lubridate)
library(zoo)

temp <- data.frame(
        date = as.Date(c("2015-01-01", "2015-02-01", "2015-03-01", "2015-04-01", "2015-05-01", "2015-06-01", "2015-07-01", "2015-08-01", "2015-09-01", "2015-10-01", "2015-11-01", "2015-12-01"))
        , value = c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12)
    ) %>%
    arrange(
        date
    ) %>%
    mutate(
        value_rollmean = rollmean(value, k = 2, fill = NA)
    ) 

temp

Он странным образом возвращает:

         date value value_rollmean
1  2015-12-01    12             NA
2  2015-11-01    11           11.5
3  2015-10-01    10           10.5
4  2015-09-01     9            9.5
5  2015-08-01     8            8.5
6  2015-07-01     7            7.5
7  2015-06-01     6            6.5
8  2015-05-01     5            5.5
9  2015-04-01     4            4.5
10 2015-03-01     3            3.5
11 2015-02-01     2            2.5
12 2015-01-01     1            1.5 

Почему последняя запись 1 декабря 2015 года NA, а не первая запись 1 января 2015 ?

Ожидаемый результат:

         date value value_rollmean
1  2015-01-01     1             NA
2  2015-02-01     2             NA
3  2015-03-01     3            1.5
4  2015-04-01     4            2.5
5  2015-05-01     5            3.5
6  2015-06-01     6            4.5
7  2015-07-01     7            5.5
8  2015-08-01     8            6.5
9  2015-09-01     9            7.5
10 2015-10-01    10            8.5
11 2015-11-01    11            9.5
12 2015-12-01    12           10.5

Ответы [ 2 ]

2 голосов
/ 16 апреля 2020

Я рад, что меня исправили, но в этом случае я думаю, что вам нужно использовать rollapply(), чтобы воспользоваться аргументом width, который, по-видимому, недоступен в указанных c вспомогательных функциях. Ширина, переданная в виде списка, рассматривается как смещение, поэтому вы можете сделать:

library(zoo)
library(dplyr)

dat %>%
  mutate(value_rollmean = rollapply(value, width = list(-(2:1)), mean, fill = NA)) 

         date value value_rollmean
1  2015-01-01     1             NA
2  2015-02-01     2             NA
3  2015-03-01     3            1.5
4  2015-04-01     4            2.5
5  2015-05-01     5            3.5
6  2015-06-01     6            4.5
7  2015-07-01     7            5.5
8  2015-08-01     8            6.5
9  2015-09-01     9            7.5
10 2015-10-01    10            8.5
11 2015-11-01    11            9.5
12 2015-12-01    12           10.5

Данные:

dat <- data.frame(
  date = as.Date(c("2015-01-01", "2015-02-01", "2015-03-01", "2015-04-01", "2015-05-01", "2015-06-01", "2015-07-01", "2015-08-01", "2015-09-01", "2015-10-01", "2015-11-01", "2015-12-01"))
  , value = c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12)
)
1 голос
/ 16 апреля 2020

Похоже, мне нужно отсортировать дату (зачем кому-то пытаться получить скользящее среднее в другом направлении?!)

library(dplyr)
library(lubridate)
library(zoo)

temp <- data.frame(
        date = as.Date(c("2015-01-01", "2015-02-01", "2015-03-01", "2015-04-01", "2015-05-01", "2015-06-01", "2015-07-01", "2015-08-01", "2015-09-01", "2015-10-01", "2015-11-01", "2015-12-01"))
        , value = c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12)
    ) %>%
    arrange(
        desc(date)
    ) %>%
    mutate(
        value_rollmean = rollmean(value, k = 2, fill = NA)
    ) %>%
    arrange(
        date
    )

temp
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...