5.1 Factor basics
假设我们想要创建一个记录月份的变量:
使用字符串来记录月份有两个问题:
- 理论上,月份只有 12 个取值。但使用字符串时,我们没有办法告诉 R 什么样的值才是合法的,即使输入错误,代码也不会有什么反应。
- 对月份的排序没有意义,因为字符串总是按照字母顺序排列的
我们可以使用因子来解决以上两个问题。想要创建一个因子,最好先创建指定因子水平顺序的一个向量:
month_levels <- c("Jan", "Feb", "Mar", "Apr", "May", "Jun",
"Jul", "Aug", "Sep", "Oct", "Nov", "Dec")
现在可以开始创建因子了:
y1 <- factor(x1, levels = month_levels)
y1
#> [1] Dec Apr Jan Mar
#> Levels: Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec
使用因子类型后,不在有效水平向量内的的所有值都会自动转换为 NA
:
y2 <- factor(x2, levels = month_levels)
y2
#> [1] Dec Apr <NA> Mar
#> Levels: Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec
如果要显示错误信息,可以用readr::parse_factor()
函数代替 factor()
,当 x
的中的某些元素不在有效水平列表时返回错误信息:
如果省略了定义水平向量这个步骤,那么R会按照字母顺序作为水平由低到高的顺序:
有时候我们会想让因子的水平顺序与创建时输入的顺序保持一致。在创建因子时,将levels
设定为unique(x)
,就可以达到这个目的:
x1
#> [1] "Dec" "Apr" "Jan" "Mar"
f1 <- factor(x1, levels = unique(x1))
f1
#> [1] Dec Apr Jan Mar
#> Levels: Dec Apr Jan Mar
如果想要直接访问因子的有效水平向量或者个数,可以使用levels()
和nlevels()
函数: