因子 Factor
因子(factor)是一个对同长的其他向量元素 进行分类(分组)的向量对象。 R 同时提供有序(ordered)和无序(unordered)因子。 而“真正”使用因子是在设计模型公式的时候。
因子(factor)用来存储分类数据,因子向量只能存储事先定义的值; A factor is a vector that can contain only predefined values, and is used to store categorical data. (adv-r) 不能添加一个“非法”的水平,可以提前插入新的水平
因子的值本质上是一种分类,而非数字。
因子的水平(level):因子向量中不同值的记录
因子的长度:length(factorName):为数据的长度,而非水平的个数
对因子的操作
定义因子
# 定义一个因子
x.f <- factor(c('A', 'B', 'A', 'A', 'B', 'A'))
x.f
## [1] A B A A B A
## Levels: A B
class(x.f)
## [1] "factor"
levels(x.f)
## [1] "A" "B"
length(x.f)
## [1] 6
插入新的水平
# 不能使用未定义的(非法)水平
x.f[3] <- 'C'
## Warning message:
## In `[<-.factor`(`*tmp*`, 3, value = "C") :
## invalid factor level, NA generated
# 可以提前插入新的水平
x<- c('A', 'B', 'A', 'A', 'B', 'A')
x.f <- factor(x, levels = c("A", "B", "C"))
x.f
## [1] A B A A B A
## Levels: A B C
因子类型转换为其他类型
数字型因子向量转换为数值向量,需要先使用as.character转换为字符型;
x.f <- factor(c(20:25))
as.integer(x.f)
## [1] 1 2 3 4 5 6
as.integer(as.character(x.f))
## [1] 20 21 22 23 24 25
因子组合
组合因子时需要注意:
# 定义两个因子向量
x.f1 <- factor(c('A', 'B', 'A'))
x.f2 <- factor(1:3)
unclass(x.f1)
## [1] 1 2 1
## attr(,"levels")
## [1] "A" "B"
unclass(x.f2)
## [1] 1 2 3
## attr(,"levels")
## [1] "1" "2" "3"
c(x.f1, x.f2)
## [1] 1 2 1 1 2 3
c(as.character(x.f1), as.character(x.f2))
## [1] "A" "B" "A" "1" "2" "3"
读入数据时对因子的处理
在读入数据时,R中大部分loading Function会自动将字符型向量转换为因子向量,为避免这种情况,可以在函数参数中设置
stringsAsFactors = FALSE
也可以使用
options(stringsAsFactors = FALSE)
全局设置,但并不建议这样使用。
Changing a global option may have unexpected consequences when combined with other code (either from packages, or code that you’re source()ing)
注意事项
只有部分适用于字符型向量的函数,可以应用在因子向量上(gsub,grepl),另一些则会抛出错误(nchar)。 建议在类似场景下,将因子向量转换为字符型向量进行处理