[R] Using merge can convert character variables to factor

ripley@stats.ox.ac.uk
Thu, 16 May 2002 19:56:50 -0000

On Thu, 16 May 2002, David Kane  <David Kane wrote:

> I am not sure if this is a bug or a feature, but I could not find it
> documented. In certain circumstances, using merge can convert a character
> variable to factor. Consider a simple example:
>
> > x <- data.frame(a = 1:4)
> > y <- data.frame(b = LETTERS[1:3])
> > z <- merge(x, y, by = 0)
> > unlist(lapply(z, data.class))
> Row.names         a         b
>  "factor" "integer"  "factor"
>
> So far, so good. b should be a factor since it is a factor in y.
>
> > is.factor(y$b)
> [1] TRUE
>
> Changing b to be a charcter variable works as well.
>
> > y$b <- as.character(y$b)
> > z <- merge(x, y, by = 0)
> > unlist(lapply(z, data.class))
>   Row.names           a           b
>    "factor"   "integer" "character"
>
> But when we change the merge to include all of the x rows in the resulting
> dataframe, we get:
>
> > z <- merge(x, y, by = 0, all.x = TRUE)
> > unlist(lapply(z, data.class))
> Row.names         a         b
>  "factor" "integer"  "factor"

sapply would be better, BTW.

> I think that b should still be a character variable in this case.

Well, b is character in x and factor in y. Your example is inconsistent:
perhaps it should complain at you?

--
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 272860 (secr)
Oxford OX1 3TG, UK                Fax:  +44 1865 272595


-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-
r-help mailing list -- Read http://www.ci.tuwien.ac.at/~hornik/R/R-FAQ.html
Send "info", "help", or "[un]subscribe"
(in the "body", not the subject !)  To: r-help-request at
stat.math.ethz.ch
_._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._