This is a generalisaton of stats::relevel() that allows you to move any number of levels to any location.

fct_relevel(f, ..., after = 0L)

Arguments

f

A factor.

...

Character vector of levels. Any levels not mentioned will be left in existing order, after the explicitly mentioned levels.

after

Where should the new values be placed?

Examples

f <- factor(c("a", "b", "c", "d")) fct_relevel(f)
#> [1] a b c d #> Levels: a b c d
fct_relevel(f, "c")
#> [1] a b c d #> Levels: c a b d
fct_relevel(f, "b", "a")
#> [1] a b c d #> Levels: b a c d
# Move to the third position fct_relevel(f, "a", after = 2)
#> [1] a b c d #> Levels: b c a d
# Relevel to the end fct_relevel(f, "a", after = Inf)
#> [1] a b c d #> Levels: b c d a
fct_relevel(f, "a", after = 3)
#> [1] a b c d #> Levels: b c d a
# Using 'Inf' allows you to relevel to the end when the number # of levels is unknown or variable (e.g. vectorised operations) df <- forcats::gss_cat[, c("rincome", "denom")] lapply(df, levels)
#> $rincome #> [1] "No answer" "Don't know" "Refused" "$25000 or more" #> [5] "$20000 - 24999" "$15000 - 19999" "$10000 - 14999" "$8000 to 9999" #> [9] "$7000 to 7999" "$6000 to 6999" "$5000 to 5999" "$4000 to 4999" #> [13] "$3000 to 3999" "$1000 to 2999" "Lt $1000" "Not applicable" #> #> $denom #> [1] "No answer" "Don't know" "No denomination" #> [4] "Other" "Episcopal" "Presbyterian-dk wh" #> [7] "Presbyterian, merged" "Other presbyterian" "United pres ch in us" #> [10] "Presbyterian c in us" "Lutheran-dk which" "Evangelical luth" #> [13] "Other lutheran" "Wi evan luth synod" "Lutheran-mo synod" #> [16] "Luth ch in america" "Am lutheran" "Methodist-dk which" #> [19] "Other methodist" "United methodist" "Afr meth ep zion" #> [22] "Afr meth episcopal" "Baptist-dk which" "Other baptists" #> [25] "Southern baptist" "Nat bapt conv usa" "Nat bapt conv of am" #> [28] "Am bapt ch in usa" "Am baptist asso" "Not applicable" #>
df2 <- lapply(df, fct_relevel, "Don't know", after = Inf) lapply(df2, levels)
#> $rincome #> [1] "No answer" "Refused" "$25000 or more" "$20000 - 24999" #> [5] "$15000 - 19999" "$10000 - 14999" "$8000 to 9999" "$7000 to 7999" #> [9] "$6000 to 6999" "$5000 to 5999" "$4000 to 4999" "$3000 to 3999" #> [13] "$1000 to 2999" "Lt $1000" "Not applicable" "Don't know" #> #> $denom #> [1] "No answer" "No denomination" "Other" #> [4] "Episcopal" "Presbyterian-dk wh" "Presbyterian, merged" #> [7] "Other presbyterian" "United pres ch in us" "Presbyterian c in us" #> [10] "Lutheran-dk which" "Evangelical luth" "Other lutheran" #> [13] "Wi evan luth synod" "Lutheran-mo synod" "Luth ch in america" #> [16] "Am lutheran" "Methodist-dk which" "Other methodist" #> [19] "United methodist" "Afr meth ep zion" "Afr meth episcopal" #> [22] "Baptist-dk which" "Other baptists" "Southern baptist" #> [25] "Nat bapt conv usa" "Nat bapt conv of am" "Am bapt ch in usa" #> [28] "Am baptist asso" "Not applicable" "Don't know" #>
# You'll get a warning if the levels don't exist fct_relevel(f, "e")
#> Warning: Unknown levels in `f`: e
#> [1] a b c d #> Levels: a b c d