[R] what does "numeric" mean? {was ... as.matrix.data.frame() ...}

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

From: Martin Maechler (maechler@stat.math.ethz.ch)
Date: Tue 25 May 2004 - 06:16:15 EST


Message-id: <16562.22543.823840.710442@gargle.gargle.HOWL>


>>>>> "BDR" == Prof Brian Ripley <ripley@stats.ox.ac.uk>
>>>>> on Mon, 24 May 2004 17:02:21 +0100 (BST) writes:

    BDR> I don't think a POSIXt element *is* numeric (that's a
    BDR> basic atomic vector),

well, yes, in some strict sense, but at least

> is.atomic( ISOdatetime(2003,1,1:3,0,0,0))
 [1] TRUE

    BDR> so the new behaviour seems right to me. The Warning is
    BDR> wrong, though, and will be fixed.

Further note that data.matrix(.) still does convert to
numeric, and AFAIK all good books on S / R tell you to rather
use data.matrix(df) in situations you want a numeric matrix from a
data frame df.

    BDR> 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")

  <................>

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

that is a point, particularly together with the above
is.atomic(foo$dt) |-> 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

Note that with a factor (instead of POSIX*t),
things are similar

> str(ffoo <- data.frame(x=1:3, f=gl(3,1)))
 `data.frame': 3 obs. of 2 variables:
  $ x: int 1 2 3
  $ f: Factor w/ 3 levels "1","2","3": 1 2 3
> as.matrix(ffoo)
   x f
 1 "1" "1"
 2 "2" "2"
 3 "3" "3"
> data.matrix(ffoo)
   x f
 1 1 1
 2 2 2
 3 3 3

but in that case,

> is.numeric(ffoo$f)
  [1] FALSE

hence, all according to the docs

------

Maybe we should either be more specific in help(as.matrix)
{and more other places ?} about what "numeric" means there,
or consider -- and this may well be unfeasible because it
potentially breaks current code -- to redefine
'is.numeric(.)' to be more restrictive:

e.g.,

   if (is.object(x)) ===> ! is.numeric(x)

?

Martin

______________________________________________
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