R: diff() и tsibble — должны быть размером n или 1, а не n-2

#r #tidyverse #tsibble

Вопрос:

Дано:

 test <- tsibble(
  date = lubridate::now()   0:9,
  value = rnorm(10)
)  %>%
  mutate (vdiff =diff(value, differences = 2))
 

Как мне избежать следующего :

Ошибка: Проблема с mutate() колонкой vdiff . ℹ vdiff = diff(value, differences = 2, na.pad = TRUE) . vdiff ℹ должен быть размер 10 или 1, а не 8

Я попытался добавить na.pad = TRUE , но это не возымело никакого эффекта (и в любом случае я бы предпочел дополнить 0 не NA ).

Ответ №1:

Одним из подходов к достижению желаемого результата было бы использование dplyr::lag . Однако благодаря комментарию @Mitchello’Hara-Wild есть более простой способ достичь этого, просто используя tsibble::difference

 library(tsibble)
library(dplyr)

set.seed(42)

d <- tsibble(
  date = lubridate::now()   0:9,
  value = rnorm(10)
)  
#> Using `date` as index variable.

d %>%
  mutate(vdiff = difference(value, differences = 2, default = 0))
#> # A tsibble: 10 x 3 [1s] <?>
#>    date                  value  vdiff
#>    <dttm>                <dbl>  <dbl>
#>  1 2021-06-20 14:33:28  1.37    0    
#>  2 2021-06-20 14:33:29 -0.565   0    
#>  3 2021-06-20 14:33:30  0.363   2.86 
#>  4 2021-06-20 14:33:31  0.633  -0.658
#>  5 2021-06-20 14:33:32  0.404  -0.498
#>  6 2021-06-20 14:33:33 -0.106  -0.282
#>  7 2021-06-20 14:33:34  1.51    2.13 
#>  8 2021-06-20 14:33:35 -0.0947 -3.22 
#>  9 2021-06-20 14:33:36  2.02    3.72 
#> 10 2021-06-20 14:33:37 -0.0627 -4.19
 

Комментарии:

1. Вы также можете использовать difference() функцию, которая дополняет значения NA.

2. @Митчелло’Хара-Дикий. Спасибо, что указали на это. Не знал об этом, я не знаком с tsibble пакетом. Еще более проблематично то, что мой подход на самом деле приводит к неправильному результату, поскольку я упустил разницу между «отставанием» и «различиями».