Skip to content

table(factor(x), exclude=NULL) (PR#11494)

2 messages · David Duffy, Peter Dalgaard

#
Hi. I don't know if this a bug or just annoying to me:
x
    1    2    3 <NA>
    1    1    1    1
1 2 3
1 1 1

I don't think many people use factor(x, exclude=NULL): it is not the 
default handling of character data by read.table().

Cheers, David Duffy.
7 days later
#
David.Duffy at qimr.edu.au wrote:
I've moved this to "wishlist" in the  bug repository. It's a documented 
annoyance, but we might be able to do better.

The underlying issue is the following:

 > f <- factor(c(1:3,NA),labels=letters[3:1])
 > f
[1] c    b    a    <NA>
Levels: c b a
 > factor(f)
[1] c    b    a    <NA>
Levels: c b a
 > factor(f,exclude=NULL)
[1] c    b    a    <NA>
Levels: c b a <NA>
 > factor(f,levels=levels(f),exclude=NULL)
[1] c    b    a    <NA>
Levels: c b a
 > factor(f,levels=c(levels(f),NA),exclude=NULL)
[1] c    b    a    <NA>
Levels: c b a <NA>

and this code in table() suggests that the latter is what was intended 
(since we actually try to pass exclude=NULL):

        cat <- if (is.factor(a)) {
            if (!missing(exclude)) {
                ll <- levels(a)
                factor(a, levels = ll[!(ll %in% exclude)], exclude = if 
(is.null(exclude))
                  NULL
                else NA)
            }
            else a

(levels = if(is.null(exclude)) c(ll,NA) else ll[!(ll %in% exclude)] 
should do. This will change behaviour of the case where you have mixed 
factors and non-factors, so I'm not just implementing it right away.