[R] column names in matrix vs. data frame in R 1.8

Prof Brian Ripley ripley at stats.ox.ac.uk
Mon Feb 16 17:52:37 CET 2004


On Mon, 9 Feb 2004 White.Denis at epamail.epa.gov wrote:

> 
> 
> 
> 
> > White.Denis at epamail.epa.gov writes:
> >
> > > Is the difference in behavior below, introduced in 1.8, inconsistent
> or,
> > > at least, undesirable?  I couldn't find this in the NEWS.
> > >
> > > On the one hand,
> > >
> > > > a <- matrix (1:4, nrow=2)
> > > > a <- data.frame (a)
> > > > names (a) <- c("break","next")
> > > > names (a)
> > > [1] "break" "next"
> > >
> > > On the other,
> > >
> > > > a <- matrix (1:4, nrow=2)
> > > > dimnames(a) <- list (1:2, c("break","next"))
> > > > a <- data.frame (a)
> > > > names(a)
> > > [1] "break." "next."
> >
> > Works fine if you don't use keywords as column names
> >
> > > a <- matrix (1:4, nrow=2)
> > > dimnames(a) <- list (1:2, c("foo","bar"))
> > > b <- data.frame(a)
> > > names(b)
> > [1] "foo" "bar"
> >
> > The difference in the result for your example has to do with an extra
> > step in the second case to obtain a legitimate name that can be used
> > with the $ operator.  R generates a syntax error for
> >
> > a$break
> >
> > but not for
> >
> > a$break.
> 
> Ok, I'll regard it as an inconsistency that the conversion of dimnames
> to data frame column names changes reserved words to legitimate names
> but direct assignment doesn't.

It's not inconsistent.  data.frame has an argument `check.names' to
control the behaviour on *creating* a data frame, and you didn't consult
the documentation.  Using the function names<- on the list underlying the
data frame does not know or care it is applied to a data frame.

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