Aliases: factor ordered is.factor is.ordered as.factor as.ordered is.na<-.factor Math.factor Ops.factor Summary.factor Ops.ordered Summary.ordered addNA .valid.factor c.factor
### ** Examples (ff <- factor(substring("statistics", 1:10, 1:10), levels = letters))
[1] s t a t i s t i c s Levels: a b c d e f g h i j k l m n o p q r s t u v w x y z
as.integer(ff) # the internal codes
[1] 19 20 1 20 9 19 20 9 3 19
(f. <- factor(ff)) # drops the levels that do not occur
[1] s t a t i s t i c s Levels: a c i s t
ff[, drop = TRUE] # the same, more transparently
[1] s t a t i s t i c s Levels: a c i s t
factor(letters[1:20], labels = "letter")
[1] letter1 letter2 letter3 letter4 letter5 letter6 letter7 letter8 [9] letter9 letter10 letter11 letter12 letter13 letter14 letter15 letter16 [17] letter17 letter18 letter19 letter20 20 Levels: letter1 letter2 letter3 letter4 letter5 letter6 letter7 ... letter20
class(ordered(4:1)) # "ordered", inheriting from "factor"
[1] "ordered" "factor"
z <- factor(LETTERS[3:1], ordered = TRUE) ## and "relational" methods work: stopifnot(sort(z)[c(1,3)] == range(z), min(z) < max(z)) ## Don't show: of <- ordered(ff) stopifnot(identical(range(of, rev(of)), of[3:2]), identical(max(of), of[2])) ## End(Don't show) ## suppose you want "NA" as a level, and to allow missing values. (x <- factor(c(1, 2, NA), exclude = NULL))
[1] 1 2 <NA> Levels: 1 2 <NA>
is.na(x)[2] <- TRUE x # [1] 1 <NA> <NA>
[1] 1 <NA> <NA> Levels: 1 2 <NA>
is.na(x)
[1] FALSE TRUE FALSE
# [1] FALSE TRUE FALSE ## More rational, since R 3.4.0 : factor(c(1:2, NA), exclude = "" ) # keeps <NA> , as
[1] 1 2 <NA> Levels: 1 2 <NA>
factor(c(1:2, NA), exclude = NULL) # always did
[1] 1 2 <NA> Levels: 1 2 <NA>
## exclude = <character> z # ordered levels 'A < B < C'
[1] C B A Levels: A < B < C
factor(z, exclude = "C") # does exclude
[1] <NA> B A Levels: A < B
factor(z, exclude = "B") # ditto
[1] C <NA> A Levels: A < C
## Now, labels maybe duplicated: ## factor() with duplicated labels allowing to "merge levels" x <- c("Man", "Male", "Man", "Lady", "Female") ## Map from 4 different values to only two levels: (xf <- factor(x, levels = c("Male", "Man" , "Lady", "Female"), labels = c("Male", "Male", "Female", "Female")))
[1] Male Male Male Female Female Levels: Male Female
#> [1] Male Male Male Female Female #> Levels: Male Female ## Using addNA() Month <- airquality$Month table(addNA(Month))
5 6 7 8 9 <NA> 31 30 31 31 30 0
table(addNA(Month, ifany = TRUE))
5 6 7 8 9 31 30 31 31 30