在R中,因子用于处理类别变量,即具有固定和已知的可能值集的变量。 当要以非字母顺序显示字符向量时,它们也很有用。
library(tidyverse)
1. Creating factors
x1 <- c("Dec", "Apr", "Jan", "Mar")
使用字符串记录此变量有两个问题:
x2 <- c("Dec", "Apr", "Jam", "Mar")
sort(x1)
#> [1] "Apr" "Dec" "Jan" "Mar"
可以通过一个因素解决这两个问题。 要创建因子,必须首先创建有效水平的列表:
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
sort(y1)
#> [1] Jan Mar Apr Dec
#> 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()
:
y2 <- parse_factor(x2, levels = month_levels)
#> Warning: 1 parsing failure.
#> row col expected actual
#> 3 -- value in level set Jam
如果省略这些级别,则它们将按字母顺序从数据中获取:
factor(x1)
#> [1] Dec Apr Jan Mar
#> Levels: Apr Dec Jan Mar
有时,希望级别的顺序与数据中首次出现的顺序相匹配。 在创建因子时,可以通过将级别设置为unique(x)或事后使用fct_inorder()来做到这一点:
f1 <- factor(x1, levels = unique(x1))
f1
#> [1] Dec Apr Jan Mar
#> Levels: Dec Apr Jan Mar
f2 <- x1 %>% factor() %>% fct_inorder()
f2
#> [1] Dec Apr Jan Mar
#> Levels: Dec Apr Jan Mar
如果需要直接访问一组有效级别,则可以使用level()进行访问:
levels(f2)
#> [1] "Dec" "Apr" "Jan" "Mar"
参考:
https://r4ds.had.co.nz/factors.html