From pdalgd at gmail.com  Sat Oct 13 09:10:47 2012
From: pdalgd at gmail.com (peter dalgaard)
Date: Sat, 13 Oct 2012 09:10:47 +0200
Subject: [Rd] as.data.frame.matrix() returns an invalid object
In-Reply-To: <CACk-te39O9M3XZ=MFBLSht1XP09N2Ce0iBDiFM66YEuLouGOeg@mail.gmail.com>
References: <507665BF.9040000@fhcrc.org>
	<CACk-te39O9M3XZ=MFBLSht1XP09N2Ce0iBDiFM66YEuLouGOeg@mail.gmail.com>
Message-ID: <75E59C99-BA7C-4A93-ADEF-1BCE949BA5D1@gmail.com>


On Oct 11, 2012, at 16:02 , Bert Gunter wrote:

> ... and further
> 
>> identical(as.list(df2),as.list(df1))
> [1] TRUE
> 
> in R 2.15.0
> 
> Not sure whether these sorts of degenerate cases are of much value,
> though. But I'll leave that for the wizards.

Looks like this is easier to fix that to argue pro/con fixing it...

AFAICS, there's a gap in the logic in as.data.frame.matrix:

    if (length(row.names) != nrows) 
        row.names <- .set_row_names(nrows)

but length(NULL) is 0 so we can end up leaving row.names at NULL and eventually nulling it in the result. An explicit check for is.null(row.names) should help.

-pd
> 
> -- Bert
> 
> On Wed, Oct 10, 2012 at 11:22 PM, Herv? Pag?s <hpages at fhcrc.org> wrote:
>> Hi,
>> 
>> Two ways to create what should normally be the same data frame:
>> 
>>> df1 <- data.frame(a=character(0), b=character(0))> df1
>>  [1] a b
>>  <0 rows> (or 0-length row.names)
>> 
>>> df2 <- as.data.frame(matrix(character(0), ncol=2, dimnames=list(NULL,
>> letters[1:2])))
>>> df2
>>  [1] a b
>>  <0 rows> (or 0-length row.names)
>> 
>> unique() works as expected except that I get a warning on 'df2':
>> 
>>> unique(df1)
>>  [1] a b
>>  <0 rows> (or 0-length row.names)
>> 
>>> unique(df2)
>>  [1] a b
>>  <0 rows> (or 0-length row.names)
>>  Warning message:
>>  In is.na(rows) : is.na() applied to non-(list or vector) of type 'NULL'
>> 
>> Look like the two data frames are not identical:
>> 
>>> identical(df1, df2)
>>  [1] FALSE
>> 
>>> all.equal(df1, df2)
>>  [1] "Attributes: < Length mismatch: comparison on first 1 components >"
>> 
>>> attributes(df1)
>>  $names
>>  [1] "a" "b"
>> 
>>  $row.names
>>  integer(0)
>> 
>>  $class
>>  [1] "data.frame"
>> 
>>> attributes(df2)
>>  $names
>>  [1] "a" "b"
>> 
>>  $class
>>  [1] "data.frame"
>> 
>> Actually 'df2' is considered broken by validObject():
>> 
>>> validObject(df1)
>>  [1] TRUE
>> 
>>> validObject(df2)
>>  Error in validObject(df2) :
>>    invalid class ?data.frame? object: slots in class definition but not in
>> object: "row.names"
>> 
>> This is with R 2.15 and recent R devel.
>> 
>> Cheers,
>> H.
>> 
>> --
>> Herv? Pag?s
>> 
>> Program in Computational Biology
>> Division of Public Health Sciences
>> Fred Hutchinson Cancer Research Center
>> 1100 Fairview Ave. N, M1-B514
>> P.O. Box 19024
>> Seattle, WA 98109-1024
>> 
>> E-mail: hpages at fhcrc.org
>> Phone:  (206) 667-5791
>> Fax:    (206) 667-1319
>> 
>> ______________________________________________
>> R-devel at r-project.org mailing list
>> https://stat.ethz.ch/mailman/listinfo/r-devel
> 
> 
> 
> -- 
> 
> Bert Gunter
> Genentech Nonclinical Biostatistics
> 
> Internal Contact Info:
> Phone: 467-7374
> Website:
> http://pharmadevelopment.roche.com/index/pdb/pdb-functional-groups/pdb-biostatistics/pdb-ncb-home.htm
> 
> ______________________________________________
> R-devel at r-project.org mailing list
> https://stat.ethz.ch/mailman/listinfo/r-devel

-- 
Peter Dalgaard, Professor,
Center for Statistics, Copenhagen Business School
Solbjerg Plads 3, 2000 Frederiksberg, Denmark
Phone: (+45)38153501
Email: pd.mes at cbs.dk  Priv: PDalgd at gmail.com



[Rd] as.data.frame.matrix() returns an invalid object
peter dalgaard