因子(factor)
基本概念
- 因子用于对数据进行分类并将其存储为不同级别的数据对象。
- 类别变量在R中称为因子(factor),因子的取值称为水平(level).
- 统计中的变量分为:区间变量(连续变量),有序变量、名义变量(分类变量)。
- 区间变量(连续变量):取连续的数值,可以进行求和,平均值等运算
- 名义型变量:没有顺序之分的类别变量。如:性别,省份,职业
- 有序变量:表示一种顺序关系,而非数量关系。如:班级,名次,病情
- 名义变量和有序变量在R中称为因子。
- 函数factor()以一个整数向量的形式存储类别值,整数的取值范围为1…k,同时一个由字符串组成的内部向量将映射到这些整数上。
- 水平(level)表示向量中不同值的记录。
因子的应用
- 计算频数
- 独立性检验
- 相关性检验
- 方差分析
- 主成分分析
- 因子分析
- ……
因子变量
基本数据集mtcars(32辆汽车11个指标数据)
参数说明:
[, 1] mpg Miles/(US) gallon
[, 2] cyl Number of cylinders
[, 3] disp Displacement (cu.in.)
[, 4] hp Gross horsepower
[, 5] drat Rear axle ratio
[, 6] wt Weight (1000 lbs)
[, 7] qsec 1/4 mile time
[, 8] vs Engine (0 = V-shaped, 1 = straight)
[, 9] am Transmission (0 = automatic, 1 = manual)
[,10] gear Number of forward gears
[,11] carb Number of carburetors
哪些可以作为分类的因子变量?
cyl vs am gear carb
> table(mtcars$cyl)
4 6 8
11 7 14
> table(mtcars$am)
0 1
19 13
创建因子(factor)
> data<-c("Type1","Type2","Type1","Type1")
> typeof(data) #字符型向量
[1] "character
> f_data<-factor(data) #转换成因子型
> f_data
[1] Type1 Type2 Type1 Type1
Levels: Type1 Type2
> as.numeric(f_data) #以数值型显示
[1] 1 2 1 1
> mode(f_data)
[1] "numeric"
> typeof(f_data)
[1] "integer"
> class(f_data)
[1] "factor“
- 因子表示向量中互异的值,即向量元素的类别,且根据数字和字母表顺序自动排序
- 数值型向量表明因子中的数据已经重新编码并存储为水平的序号
> grade<-c('B','A','A','B','B')
> fac_grade<-factor(grade,levels=c('A','B','C'))
> fac_grade
[1] B A A B B
Levels: A B C
> fac_grade[length(fac_grade)+1]<-'C'
> fac_grade
[1] B A A B B C
Levels: A B C
通过factor函数的参数levels指定水平,否则,默认来源于因子向量
> fac_grade[length(fac_grade)+1]<-'D'
Warning message:
In `[<-.factor`(`*tmp*`, length(fac_grade) + 1, value = "D") :
invalid factor level, NA generated
> fac_grade
[1] B A A B B C <NA>
Levels: A B C
> summary(fac_grade)
A B C NA's
2 3 1 1
- 向因子中添加一个不存在水平中的元素会产生空值
- summary()显示对象的统计概要,显示因子各水平出现的频率
因子绘图
> plot(mtcars$cyl)
> mtcars$cyl
[1] 6 6 4 6 8 6 8 4 4 6 6 8 8 8 8 8 8 4 4 4 4 8 8 8 8 4 4 4 8 6 8 4
说明:plot函数的数据集如果是向量,则输出散点图
> fcyl<-factor(mtcars$cyl)
> fcyl
[1] 6 6 4 6 8 6 8 4 4 6 6 8 8 8 8 8 8 4 4 4 4 8 8 8 8 4 4 4 8 6 8 4
Levels: 4 6 8
> plot(fcyl)
说明:plot函数的数据集如果是因子,则输出条形图
函数
tapply()函数
函数基本形式:
tapply(x,f,g),其中:x表示向量,f表示因子或者因子列表,g表示函数
函数执行过程:
暂时将x进行分组,每组对应一个因子水平(在多重因子的情况下对应一组因子水平的组合),得到x的子向量,然后这些子向量应用函数g()。
> x<-c("M","F","F","M","M")
> sex<-factor(x)
> h<-c(165,170,168,172,159)
> tapply(h,sex,mean)
F M
169.0000 165.3333
split()函数
split(x,f):将x按照因子f或者列表进行分组,然后返回分组的列表
#创建数据框
> gender<-c("M","M","F","M","F","F")
> age<-c(45,48,50,32,38,27)
> income<-c(55000,88000,34567,76899,56789,23455)
> over35<-c(1,1,1,0,1,0)
> df<-data.frame(gender,age,income,over35)
gender age income over35
1 M 45 55000 1
2 M 48 88000 1
3 F 50 34567 1
4 M 32 76899 0
5 F 38 56789 1
6 F 27 23455 0
将“income”按“gender”进行分类
> split(df$income,df$gender)
$F
[1] 34567 56789 23455
$M
[1] 55000 88000 76899
将“income”按“gender”和“over35”组成的列表进行分类
> split(df$income,list(df$gender,df$over35))
$F.0
[1] 23455
$M.0
[1] 76899
$F.1
[1] 34567 56789
$M.1
[1] 55000 88000