R语言—因子

因子(factor)

基本概念

  • 因子用于对数据进行分类并将其存储为不同级别的数据对象。
  • 类别变量在R中称为因子(factor),因子的取值称为水平(level).
  • 统计中的变量分为:区间变量(连续变量),有序变量、名义变量(分类变量)。
    • 区间变量(连续变量):取连续的数值,可以进行求和,平均值等运算
    • 名义型变量:没有顺序之分的类别变量。如:性别,省份,职业
    • 有序变量:表示一种顺序关系,而非数量关系。如:班级,名次,病情
  • 名义变量和有序变量在R中称为因子。
  • 函数factor()以一个整数向量的形式存储类别值,整数的取值范围为1…k,同时一个由字符串组成的内部向量将映射到这些整数上。
  • 水平(level)表示向量中不同值的记录。

image-20220904115351512

因子的应用

  • 计算频数
  • 独立性检验
  • 相关性检验
  • 方差分析
  • 主成分分析
  • 因子分析
  • ……

因子变量

基本数据集mtcars(32辆汽车11个指标数据)

image-20220904115619883

参数说明:

[, 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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

W_chuanqi

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值