[R] stringsAsFactor global option (was "character coerced to a factor")
Prof Brian Ripley
ripley at stats.ox.ac.uk
Mon Apr 23 15:48:03 CEST 2007
On Mon, 23 Apr 2007, Terry Therneau wrote:
> --- Gabor Grothendieck <ggrothendieck at gmail.com>
>> Just one caveat. I personally would try to avoid
>> global options since it can cause conflicts when
>> two different programs assume two different settings
>> of the same global option and need to interact.
> I see this argument often, and don't buy it. In any case, for this
> particular option, the Mayo biostatistics group (~120 users) has had
> stringsAsFactors=F as a global default for 15+ years now with no ill effects.
> It is much less confusing for both new and old users.
> Johh Kane asked "Any idea what the rationale was for setting the
> option to TRUE?" When factors were first introduced, there was no option
> to turn them off. Reading between the lines of the white book (Statistical
> Models in S) that introduced them, this is my guess: they made perfect sense for
> the particular data sets that were being analysed by the authors at the time.
> Many of the defaults in the survival package, which I wrote, have exactly the
> same rationale --- so let us not be too harsh on an author for not forseeing
> all the future consequences of a default!
> A place where factors really are a pain is when the patient id is a character
> string. When, for instance, you subset the data to do an analysis of only
> the females, having the data set `remember' all of the male id's (the original
> levels) is non-productive in dozens of ways. For other variables factors
> work well and have some nice properties. In general, I've found in my work
> (medical research) that factors are beneficial for about 1/5 of the character
> variables, a PITA for 1/4, and a wash for the rest; so prefer to do any
> transformations myself.
> For the historically curious:
> In Splus, one originally fixed this with an override of the function
> as.data.frame.character <- as.data.frame.vector
> before they added the global option. In R, unfortunately, this override
> didn't work due to namespaces, and we had to wait for the option to be
> added. (Another dammed-if-you-do dammed-if-you-don't issue. Normally you
> don't want users to be able to override a base function, because 9 times out
> of 10 they did it by accident and dont' want it either. But when a user really
> does want to do so ...)
That is what 'assignInNamespace' is for (and it came in with namespaces).
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