buhtz -4 years ago 254
R Question

# replace <NA> in a factor column in R

I want to replace

`<NA>`
values in a factors column with a valid value. But I can not find a way. This example is only for demonstration. The original data comes from a foreign csv file I have to deal with.

``````df <- data.frame(a=sample(0:10, size=10, replace=TRUE),
b=sample(20:30, size=10, replace=TRUE))
df[df\$a==0,'a'] <- NA
df\$a <- as.factor(df\$a)
``````

Could look like this

``````      a  b
1     1 29
2     2 23
3     3 23
4     3 22
5     4 28
6  <NA> 24
7     2 21
8     4 25
9  <NA> 29
10    3 24
``````

Now I want to replace the
`<NA>`
values with a number.

``````df[is.na(df\$a), 'a'] <- 88
In `[<-.factor`(`*tmp*`, iseq, value = c(88, 88)) :
invalid factor level, NA generated
``````

I think I missed a fundamental R concept about factors. Am I?
I can not understand why it doesn't work. I think
`invalid factor level`
means that
`88`
is not a valid level in that factor, right? So I have to tell the factor column that there is another level?

1) addNA If `fac` is a factor `addNA(fac)` is the same factor but with NA added as a level. See `?addNA`

To force the NA level to be 88:

``````facna <- addNA(fac)
lv <- levels(facna)
levels(facna) <- replace(lv, is.na(lv), 88)
``````

giving:

``````> facna
[1] 1  2  3  3  4  88 2  4  88 3
Levels: 1 2 3 4 88
``````

2) factor It can also be done in one line using the various arguments of `factor` like this:

``````factor(fac, levels = levels(addNA(fac)), labels = c(levels(fac), 88), exclude = NULL)
``````

2a) or equivalently:

``````factor(fac, levels = c(levels(fac), NA), labels = c(levels(fac), 88), exclude = NULL)
``````

3) ifelse Another approach is:

``````factor(ifelse(is.na(fac), 88, paste(fac)), levels = c(levels(fac), 88))
``````

Note: We used the following for input `fac`

``````fac <- structure(c(1L, 2L, 3L, 3L, 4L, NA, 2L, 4L, NA, 3L), .Label = c("1",
"2", "3", "4"), class = "factor")
``````
Recommended from our users: Dynamic Network Monitoring from WhatsUp Gold from IPSwitch. Free Download