• 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 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    创建因子(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“
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 因子表示向量中互异的值,即向量元素的类别,且根据数字和字母表顺序自动排序
    • 数值型向量表明因子中的数据已经重新编码并存储为水平的序号
    > 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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    通过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    
    Levels: A B C
    > summary(fac_grade)
       A    B    C NA's 
       2    3    1    1 
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 向因子中添加一个不存在水平中的元素会产生空值
    • 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
    
    
    • 1
    • 2
    • 3
    • 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)
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    在这里插入图片描述

    说明:plot函数的数据集如果是因子,则输出条形图

    函数

    tapply()函数

    函数基本形式:

    tapply(x,f,g),其中:x表示向量,f表示因子或者因子列表,g表示函数
    
    • 1

    函数执行过程:

    暂时将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 
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    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
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    将“income”按“gender”进行分类

    > split(df$income,df$gender)
    $F
    [1] 34567 56789 23455
    
    $M
    [1] 55000 88000 76899
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    将“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
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
  • 相关阅读:
    公务员备考(三十六) 行测 数资强化
    华为云云耀云服务器L实例评测|安装搭建学生成绩管理系统
    【开源三方库】Easyui:基于OpenAtom OpenHarmony ArkUI深度定制的组件框架
    Zabbix 5.0 升级到 6.0LTS
    基于AT89C51流水花样灯proteus仿真设计
    css justify-content Test210428
    【Spring系列03】依赖注入(DI)[之set注入]
    以深圳为例Python一键生成核酸检测日历
    基于Android的个人电子相册设计与实现
    【实践篇】推荐算法PaaS化探索与实践
  • 原文地址:https://blog.csdn.net/W_chuanqi/article/details/127699723