The hardware and bandwidth for this mirror is donated by METANET, the Webhosting and Full Service-Cloud Provider.
If you wish to report a bug, or if you are interested in having us mirror your free-software or open-source project, please feel free to contact us at mirror[@]metanet.ch.

Motivation

The problem arises when we have to use time-series in a data.frame or use time-series operations like lag and diff for numeric vectors in a data.frame. Let’s look into an example.

library(transx)

First, wee restrict tibble printing options to minimize the space occupied.

library(dplyr)
options(tibble.print_min = 3)

Let’s load the economics dataset from ggplot2 for illustration.

econ <- ggplot2::economics
econ
#> # A tibble: 574 x 6
#>   date         pce    pop psavert uempmed unemploy
#>   <date>     <dbl>  <dbl>   <dbl>   <dbl>    <dbl>
#> 1 1967-07-01  507. 198712    12.6     4.5     2944
#> 2 1967-08-01  510. 198911    12.6     4.7     2945
#> 3 1967-09-01  516. 199113    11.9     4.6     2958
#> # ... with 571 more rows

Then, we are going to use some stats functions:

mutate(econ, pop_lag = stats::lag(as.ts(pop)))
#> # A tibble: 574 x 7
#>   date         pce    pop psavert uempmed unemploy pop_lag
#>   <date>     <dbl>  <dbl>   <dbl>   <dbl>    <dbl>   <dbl>
#> 1 1967-07-01  507. 198712    12.6     4.5     2944  198712
#> 2 1967-08-01  510. 198911    12.6     4.7     2945  198911
#> 3 1967-09-01  516. 199113    11.9     4.6     2958  199113
#> # ... with 571 more rows

base::lag only works on ts objects. However, dplyr has thought about this problem

mutate(econ, pop_lag = dplyr::lag(pop))
#> # A tibble: 574 x 7
#>   date         pce    pop psavert uempmed unemploy pop_lag
#>   <date>     <dbl>  <dbl>   <dbl>   <dbl>    <dbl>   <dbl>
#> 1 1967-07-01  507. 198712    12.6     4.5     2944      NA
#> 2 1967-08-01  510. 198911    12.6     4.7     2945  198712
#> 3 1967-09-01  516. 199113    11.9     4.6     2958  198911
#> # ... with 571 more rows

However, this problem extends to all the univariate functions that are applied in the same manner in a data.frame. For example

mutate(econ, pop_diff = base::diff(pop))
#> Error: Problem with `mutate()` input `pop_diff`.
#> x Input `pop_diff` can't be recycled to size 574.
#> i Input `pop_diff` is `base::diff(pop)`.
#> i Input `pop_diff` must be size 574 or 1, not 573.

The idea for transx is coming from the need to construct wrapper functions.

diffx <- function(x, ...) x - dplyr::lag(x, ... )

mutate(econ, pop_diff = diffx(pop))
#> # A tibble: 574 x 7
#>   date         pce    pop psavert uempmed unemploy pop_diff
#>   <date>     <dbl>  <dbl>   <dbl>   <dbl>    <dbl>    <dbl>
#> 1 1967-07-01  507. 198712    12.6     4.5     2944       NA
#> 2 1967-08-01  510. 198911    12.6     4.7     2945      199
#> 3 1967-09-01  516. 199113    11.9     4.6     2958      202
#> # ... with 571 more rows

These binaries (installable software) and packages are in development.
They may not be fully stable and should be used with caution. We make no claims about them.