R: Recode a Factor

Recode {DescTools} | R Documentation

## Recode a Factor

### Description

Combining or rearranging a factor can be tedious if it has many levels. `Recode` supports this step by accepting a direct definition of new levels by enumerating old levelnames as argument and adding an `"elselevel"` option. If new levels are given as integer values they will be translated in the according levels.

### Usage

    Recode(x, ..., elselevel = NA, use.empty = FALSE, num = FALSE)

### Arguments

`x` | the factor whose levels are to be altered.
`...` | the old levels (combined by `c`() if there are several) named with the new level: `newlevel_a=c("old_a", "old_b"),` `newlevel_b=c("old_c", "old_d")`. See examples.
`elselevel` | the value for levels, which are not matched by newlevel's list. If this is set to `NULL`, the elselevels will be left unchanged. If set to `NA` (default) non matched levels will be set to `NA`.
`use.empty` | logical. Defines how a new level, which can't be found in x, should be handled. Should it be left in the level's list or be dropped? The default is `FALSE`, which drops empty levels.
`num` | logical. If set to `TRUE` the result will be numeric.

### Value

the factor having the new levels applied.

### Author(s)

Andri Signorell <andri@signorell.net>

### See Also

`factor`, `levels`
There's another possible solution in the package car.

### Examples

    set.seed(1984)
    x <- factor(sample(1:15, 20, replace=TRUE))
    levels(x) <- paste("old", levels(x), sep="_")

    y <- Recode(x,
                "new_1" = c("old_1","old_4","old_5"),
                "new_2" = c("old_6","old_10","old_11"),
                "new_3" = c("old_12","old_13"),
                elselevel="other")
    data.frame(x=x, y=y)

    x <- factor(letters[1:6])

    z1 <- Recode(x, AB=c("a","b"), CD=c("c","d"), elselevel="none of these")
    z2 <- Recode(x, AB=c("a","b"), CD=c("c","d"), elselevel=NA)
    z3 <- Recode(x, AB=c("a","b"), CD=c("c","d"), elselevel=NULL)
    z4 <- Recode(x, AB=c("a","b"), GH=c("g","h"), elselevel=NA, use.empty=TRUE)
    z5 <- Recode(x, AB=c("a","b"), GH=c("g","h"), elselevel=NA, use.empty=FALSE)

    data.frame(z1, z2, z3, z4, z5)

    lapply(data.frame(z1, z2, z3, z4, z5), levels)

    # empty level GH exists in z4...
    table(z4, useNA="ifany")
    # and is dropped in z5
    table(z5, useNA="ifany")

    # use integers to define the groups to collapse
    set.seed(1972)
    (likert <- factor(sample(1:10, size=15, replace=TRUE),
                     levels=1:10, labels=gettextf("(%s)", 1:10)))
    Recode(likert, det=1:6, pas=7:8, pro=9:10)
    # or directly turned to numeric
    Recode(likert, "1"=1:6, "2"=7:8, "5"=9:10, num=TRUE)

[Package DescTools version 0.99.28 Index]