[R] as.matrix.data.frame() in R 1.9.0 converts to character when it should (?) convert to numeric

Prof Brian Ripley ripley at stats.ox.ac.uk
Mon May 24 18:02:21 CEST 2004


I don't think a POSIXt element *is* numeric (that's a basic atomic
vector), so the new behaviour seems right to me.  The Warning is wrong,
though, and will be fixed.

On Mon, 24 May 2004, Don MacQueen wrote:

> Conversion of a data frame to a matrix using as.matrix() when a 
> column of the data frame is POSIXt and all other columns are numeric 
> has changed in R 1.9.0 from R 1.8.1. The new behavior issues a 
> warning message and converts to a character matrix. In R 1.8.1, such 
> an object was converted to a numeric matrix.
> 
> Here is an example.
> 
> #### R 1.9.0 ####
> >  foo <- data.frame( x=1:3,dt=ISOdatetime(2003,1,1:3,0,0,0))
> 
> >  as.matrix(foo)
>    x   dt         
> 1 "1" "2003-01-01"
> 2 "2" "2003-01-02"
> 3 "3" "2003-01-03"
> Warning message:
> longer object length
>          is not a multiple of shorter object length in: cl == 
> c("Date", "POSIXct", "POSIXlt")
> 
> >  version
>           _                  
> platform sparc-sun-solaris2.8
> arch     sparc              
> os       solaris2.8         
> system   sparc, solaris2.8  
> status   Patched            
> major    1                  
> minor    9.0                
> year     2004               
> month    04                 
> day      30                 
> language R                  
> >
> 
> 
> ### R 1.8.1 ####
> >  foo <- data.frame( x=1:3,dt=ISOdatetime(2003,1,1:3,0,0,0))
> >  foo
>    x         dt
> 1 1 2003-01-01
> 2 2 2003-01-02
> 3 3 2003-01-03
> 
> >  as.matrix(foo)
>    x         dt
> 1 1 1041408000
> 2 2 1041494400
> 3 3 1041580800
> 
> >  version
>           _                  
> platform sparc-sun-solaris2.8
> arch     sparc              
> os       solaris2.8         
> system   sparc, solaris2.8  
> status   Patched            
> major    1                  
> minor    8.1                
> year     2003               
> month    12                 
> day      03                 
> language R                  
> 
> 
> ####
> In both versions:
> >  class(foo$dt)
> [1] "POSIXt"  "POSIXct"
> 
> ####
> In R 1.8.1, as.matrix.data.frame() has these lines:
>          if (length(levels(xj)) > 0 || !(is.numeric(xj) || is.complex(xj)) ||
>              (!is.null(cl <- attr(xj, "class")) && any(cl == c("POSIXct",
>                  "POSIXlt"))))
> 
> ####
> In R 1.9.0 there is instead
>          if (length(levels(xj)) > 0 || !(is.numeric(xj) || is.complex(xj)) ||
>              (!is.null(cl <- attr(xj, "class")) && any(cl == c("Date",
>                  "POSIXct", "POSIXlt"))))
> 
> And that, I think, explains the warning message.
> 
> ####
>  From ?as.matrix() in R 1.9.0:
> 
>       'as.matrix' is a generic function. The method for data frames will
>       convert any non-numeric/complex column into a character vector
>       using 'format' and so return a character matrix, except that
>       all-logical data frames will be coerced to a logical matrix.
> 
> The POSIXt element is numeric, and so should be converted to numeric
> >  is.numeric(foo$dt)
> [1] TRUE
> >
> 
> ####
> I think this might qualify for bug status, either in and of itself or 
> relative to documentation. But I'm not, as the posting guide says, 
> "completely and utterly sure". So I'm posting to r-help first...I 
> will send a bug report if an R-core member asks me to.
> 
> Thanks
> -Don
> 

-- 
Brian D. Ripley,                  ripley at stats.ox.ac.uk
Professor of Applied Statistics,  http://www.stats.ox.ac.uk/~ripley/
University of Oxford,             Tel:  +44 1865 272861 (self)
1 South Parks Road,                     +44 1865 272866 (PA)
Oxford OX1 3TG, UK                Fax:  +44 1865 272595




More information about the R-help mailing list