Replace in a factor column

后端 未结 6 1732
南方客
南方客 2020-12-03 02:43

I want to replace 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

6条回答
  •  悲哀的现实
    2020-12-03 03:16

    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)
    levels(facna) <- c(levels(fac), 88)
    

    giving:

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

    1a) This can be written in a single line as follows:

    `levels<-`(addNA(fac), c(levels(fac), 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))
    

    4) forcats The forcats package has a function for this:

    library(forcats)
    
    fct_explicit_na(fac, "88")
    ## [1] 1  2  3  3  4  88 2  4  88 3 
    ## Levels: 1 2 3 4 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")
    

    Update: Have improved (1) and added (1a). Later added (4).

提交回复
热议问题