[R] as.vector with mode="list" and POSIXct

William Dunlap wdunlap at tibco.com
Mon May 20 23:32:32 CEST 2013


Try using as.list(x) instead of as.vector(x, mode="list").
The former has a method for POSIXct; the latter does not.

  > x <- as.POSIXct(c("2013-05-20 14:28", "2013-11-30 22:10"), tz="US/Pacific") 
  > x
  [1] "2013-05-20 14:28:00 PDT" "2013-11-30 22:10:00 PST"
  > as.list(x)
  [[1]]
  [1] "2013-05-20 14:28:00 PDT"
  
  [[2]]
  [1] "2013-11-30 22:10:00 PST"

Bill Dunlap
Spotfire, TIBCO Software
wdunlap tibco.com


> -----Original Message-----
> From: r-help-bounces at r-project.org [mailto:r-help-bounces at r-project.org] On Behalf
> Of Alexandre Sieira
> Sent: Monday, May 20, 2013 2:10 PM
> To: r-help at r-project.org
> Subject: [R] as.vector with mode="list" and POSIXct
> 
> I was trying to convert a vector of POSIXct into a list of POSIXct, However, I had a
> problem that I wanted to share with you.
> 
> Works fine with, say, numeric:
> 
> 
> > v = c(1, 2, 3)
> > v
> [1] 1 2 3
> > str(v)
>  num [1:3] 1 2 3
> > l = as.vector(v, mode="list")
> > l
> [[1]]
> [1] 1
> 
> [[2]]
> [1] 2
> 
> [[3]]
> [1] 3
> 
> > str(l)
> List of 3
>  $ : num 1
>  $ : num 2
>  $ : num 3
> 
> If you try it with POSIXct, on the other hand…
> 
> 
> > v = c(Sys.time(), Sys.time())
> > v
> [1] "2013-05-20 18:02:07 BRT" "2013-05-20 18:02:07 BRT"
> > str(v)
>  POSIXct[1:2], format: "2013-05-20 18:02:07" "2013-05-20 18:02:07"
> > l = as.vector(v, mode="list")
> > l
> [[1]]
> [1] 1369083728
> 
> [[2]]
> [1] 1369083728
> 
> > str(l)
> List of 2
>  $ : num 1.37e+09
>  $ : num 1.37e+09
> 
> The POSIXct values are coerced to numeric, which is unexpected.
> 
> The documentation for as.vector says: "The default method handles 24 input types and
> 12 values of type: the details of most coercions are undocumented and subject to
> change." It would appear that treatment for POSIXct is either missing or needs
> adjustment.
> 
> Unlist (for the reverse) is documented to converting to base types, so I can't complain.
> Just wanted to share that I ended up giving up on vectorization and writing the two
> following functions:
> 
> 
> unlistPOSIXct <- function(x) {
>   retval = rep(Sys.time(), length(x))
>   for (i in 1:length(x)) retval[i] = x[[i]]
>   return(retval)
> }
> 
> listPOSIXct <- function(x) {
>   retval = list()
>   for (i in 1:length(x)) retval[[i]] = x[i]
>   return(retval)
> }
> 
> Is there a better way to do this (other than using *apply instead of for above) that better
> leverages vectorization? Am I missing something here?
> 
> Thanks!
> 
> 
> 
> 
> --
> Alexandre Sieira
> CISA, CISSP, ISO 27001 Lead Auditor
> 
> "The truth is rarely pure and never simple."
> Oscar Wilde, The Importance of Being Earnest, 1895, Act I


More information about the R-help mailing list