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

Alexandre Sieira alexandre.sieira at gmail.com
Mon May 20 23:39:30 CEST 2013


So it does. I had tried list() but not as.list(). Silly me. :)

Thank you very much, William.

-- 
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
On 20 de maio de 2013 at 18:32:35, William Dunlap (wdunlap at tibco.com) wrote:
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