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

About this list Date view Thread view Subject view Author view Attachment view

From: Prof Brian Ripley (ripley@stats.ox.ac.uk)
Date: Tue 25 May 2004 - 02:02:21 EST


Message-id: <Pine.LNX.4.44.0405241700010.4717-100000@gannet.stats>

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@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

______________________________________________ R-help@stat.math.ethz.ch mailing list https://www.stat.math.ethz.ch/mailman/listinfo/r-help PLEASE do read the posting guide! http://www.R-project.org/posting-guide.html


About this list Date view Thread view Subject view Author view Attachment view

This archive was generated by hypermail 2.1.3 : Mon 31 May 2004 - 23:05:12 EST