column names in matrix vs. data frame in R 1.8
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