From ggrothend|eck @end|ng |rom gm@||@com  Mon Jun 10 03:40:12 2024
From: ggrothend|eck @end|ng |rom gm@||@com (Gabor Grothendieck)
Date: Sun, 9 Jun 2024 21:40:12 -0400
Subject: [Rd] head.ts, tail.ts loses time
In-Reply-To: <016d5bb8-b0ee-47f0-91b2-7a2b8c51557d@prodsyse.com>
References: <016d5bb8-b0ee-47f0-91b2-7a2b8c51557d@prodsyse.com>
Message-ID: <CAP01uRmdPR_3M5qUnD8+4REw8Fz8sSf1UrrxzJFwQN+f1dx1xQ@mail.gmail.com>

zoo overcomes many of the limitations of ts:

  library(zoo)
  as.ts(head(as.zoo(presidents)))
  ##      Qtr1 Qtr2 Qtr3 Qtr4
  ## 1945   NA   87   82   75
  ## 1946   63   50

xts also works here.

On Sun, Jun 9, 2024 at 12:04?PM Spencer Graves
<spencer.graves at prodsyse.com> wrote:
>
> Hello, All:
>
>
>           The 'head' and 'tail' functions strip the time from a 'ts' object.
> Example:
>
>
>  > head(presidents)
> [1] NA 87 82 75 63 50
>
>
>  > window(presidents, 1945, 1946.25)
>       Qtr1 Qtr2 Qtr3 Qtr4
> 1945   NA   87   82   75
> 1946   63   50
>
>
>           Below please find code for 'head.ts' and 'tail.ts' that matches
> 'window'.
>
>
>           Comments?
>           Spencer Graves
>
> head.ts <- function(x, n=6L, ...){
>    tmx <- as.numeric(time(x))
> #
>    utils:::checkHT(n, d <- dim(x))
>    if(is.na(n[1]) || n[1]==0)ts(NULL)
> #
>    firstn <- head(tmx, n[1])
>    if(is.null(d)){
>      return(window(x, firstn[1], tail(firstn, 1)))
>    } else{
>      if(length(n)<2){
>        return(window(x, firstn[1], tail(firstn, 1)))
>      } else {
>        Cols <- head(1:d[2], n[2])
>        xn2 <- x[, Cols[1]:tail(Cols, 1)]
>        return(window(xn2, firstn[1], tail(firstn, 1)))
>      }
>    }
> }
>
>
> tail.ts <- function (x, n = 6L, ...)
> {
>    utils:::checkHT(n, d <- dim(x))
>    tmx <- as.numeric(time(x))
> #
>    if(is.na(n[1]) || n[1]==0)ts(NULL)
> #
>    lastn <- tail(tmx, n[1])
>    if(is.null(d)){
>      return(window(x, lastn[1], tail(lastn, 1)))
>    } else{
>      if(length(n)<2){
>        return(window(x, lastn[1], tail(lastn, 1)))
>      } else {
>        Cols <- head(1:d[2], n[2])
>        xn2 <- x[, Cols[1]:tail(Cols, 1)]
>        return(window(xn2, lastn[1], tail(lastn, 1)))
>      }
>    }
> }
>
>
> # examples
> head(presidents)
>
> head(presidents, 2)
>
> npresObs <- length(presidents)
> head(presidents, 6-npresObs)
>
> try(head(presidents, 1:2)) # 'try-error'
>
> try(head(presidents, 0)) # 'try-error'
>
> # matrix time series
> str(pres <- cbind(n=1:length(presidents), presidents))
> head(pres, 2)
>
> head(pres, 2-npresObs)
>
> head(pres, 1:2)
> head(pres, 2:1)
> head(pres, 1:3)
>
> # examples
> tail(presidents)
>
> tail(presidents, 2)
>
> npresObs <- length(presidents)
> tail(presidents, 6-npresObs)
>
> try(tail(presidents, 1:2)) # 'try-error'
>
> try(tail(presidents, 0)) # 'try-error'
>
> # matrix time series
> str(pres <- cbind(n=1:length(presidents), presidents))
> tail(pres, 2)
>
> tail(pres, 2-npresObs)
>
> tail(pres, 1:2)
> tail(pres, 2:1)
> tail(pres, 1:3)
>
> # for unit testing:
> headPres <- head(presidents)
> pres6 <- ts(presidents[1:6], time(presidents)[1],
>              frequency=frequency(presidents))
> stopifnot(all.equal(headPres, pres6))
>
> headPres2 <- head(presidents, 2)
> pres2 <- ts(presidents[1:2], time(presidents)[1],
>              frequency=frequency(presidents))
> stopifnot(all.equal(headPres2, pres2))
>
> npresObs <- length(presidents)
> headPres. <- head(presidents, 6-npresObs)
> stopifnot(all.equal(headPres., pres6))
>
> headPresOops <- try(head(presidents, 1:2))
> stopifnot(class(headPresOops) == 'try-error')
>
> headPres0 <- try(head(presidents, 0))
> stopifnot(class(headPres0) == 'try-error')
>
> str(pres <- cbind(n=1:length(presidents), presidents))
> headP2 <- head(pres, 2)
>
> p2 <- ts(pres[1:2, ], time(presidents)[1],
>           frequency=frequency(presidents))
> stopifnot(all.equal(headP2, p2))
>
> headP2. <- head(pres, 2-npresObs)
> stopifnot(all.equal(headP2., p2))
>
>
> #############
>
>
> sessionInfo()
> R version 4.4.0 (2024-04-24)
> Platform: aarch64-apple-darwin20
> Running under: macOS Sonoma 14.5
>
> Matrix products: default
> BLAS:
> /System/Library/Frameworks/Accelerate.framework/Versions/A/Frameworks/vecLib.framework/Versions/A/libBLAS.dylib
>
> LAPACK:
> /Library/Frameworks/R.framework/Versions/4.4-arm64/Resources/lib/libRlapack.dylib;
>   LAPACK version 3.12.0
>
> locale:
> [1] en_US.UTF-8/en_US.UTF-8/en_US.UTF-8/C/en_US.UTF-8/en_US.UTF-8
>
> time zone: America/Chicago
> tzcode source: internal
>
> attached base packages:
> [1] stats     graphics  grDevices utils     datasets
> [6] methods   base
>
> loaded via a namespace (and not attached):
> [1] compiler_4.4.0 tools_4.4.0
>
> ______________________________________________
> R-devel at r-project.org mailing list
> https://stat.ethz.ch/mailman/listinfo/r-devel



-- 
Statistics & Software Consulting
GKX Group, GKX Associates Inc.
tel: 1-877-GKX-GROUP
email: ggrothendieck at gmail.com



[Rd] head.ts, tail.ts loses time
Gabor Grothendieck