美文网首页R语言基本函数解释
R语言基础教程 | 数据结构—因子

R语言基础教程 | 数据结构—因子

作者: 生信师姐 | 来源:发表于2021-06-15 07:46 被阅读0次

    变量可归结为名义型、有序型或连续型变量。名义型变量是没有顺序之分的类别变量。类别(名义型)变量和有序类别(有序型)变量在R中称为因子(factor)。因子在R中非常重要,因为它决定了数据的分析方式以及如何进行视觉呈现。因子(factor)是R语言中比较特殊的一个数据类型, 它是一个用于存储\color{red}{类别}的类型,举个例子,从性别上,可以把人分为:男人和女人,从年龄上划分,又可以把人分为:未成年人(<18岁),成年人(>=18)。

    R把表示分类的数据称为因子,因子的行为有时像字符串,有时像整数。因子是一个向量,通常情况下,每个元素都是字符类型,也有其他数据类型的元素。因子具有因子水平(Levels),用于限制因子的元素的取值范围,R强制:因子水平是字符类型,因子的元素只能从因子水平中取值,这意味着,因子的每个元素要么是因子水平中的字符(或转换为其他数据类型),要么是缺失值,这是因子的约束,是语法上的规则。

    通常情况下,在创建数据框变量时,R隐式把数据类型为字符的列创建为因子,这是因为R会把文本类型默认为类别数据,并自动转换为因子。前面我们在讲数据框时,就有提到。

    > Birthdate <-c("1984-12-29","1983-5-6","1986-8-8")
    > Name <-c("Devin","Edward","Wenli")
    > Gender <-c("M","M","F")
    > ID <- c(11,12,13)
    > student<-data.frame(ID,Gender,Name,Birthdate)
    > student
      ID Gender   Name  Birthdate
    1 11      M  Devin 1984-12-29
    2 12      M Edward   1983-5-6
    3 13      F  Wenli   1986-8-8
    
    
    > student$Gender
    [1] M M F
    Levels: F M
    

    通过class()函数检查gender列的类,结果是因子类型,而不是字符向量。

    > class(student$Gender)
    [1] "factor"
    

    1.创建因子

    可以通过factor()函数创建因子,factor()函数的第一个参数必须是字符向量,通过levels参数显式设置因子水平。

    factor(x = character(), levels, labels = levels,
           exclude = NA, ordered = is.ordered(x), nmax = NA)
    

    参数注释:

    • x:是向量,通常是由少量唯一值的字符向量
    • levels:水平,字符类型,用于设置x可能包含的唯一值,默认值是x的所有唯一值。如果x不是字符向量,那么使用as.character(x)把x转换为字符向量,然后获取x向量的水平。x向量的取值跟levels有关。
    • labels:是水平的标签,字符类型,用于对水平添加标签,相当于对因子水平重命名;
    • exclude:排除的字符
    • ordered:逻辑值,用于指定水平是否有序;
    • nmax:水平的上限数量

    例如,因子sex的值是向量c('f','m','f','f','m'),因子水平是c('f','m')

    > sex <- factor(c('f','m','f','f','m'),levels=c('f','m'))
    > sex
    [1] f m f f m
    Levels: f m
    

    2.因子水平

    因子水平规定了因子取值的范围,每一个因子,都包含因子水平的信息,例如,打印gender列,可以看到因子的元素和水平:

    > student$Gender
    [1] M M F
    Levels: F M
    

    该因子中的每个值都是一个字符串,它们被限制为“f”、“m”和缺失值(NA)。如果把其他字符串添加到gender列中,R会抛出警告消息,并把错误赋值的元素设置为NA,例如:

    > student$Gender[1]<- "female"
    Warning message:
    In `[<-.factor`(`*tmp*`, 1, value = c(NA, 2L, 1L)) :
      invalid factor level, NA generated
    

    因子水平,可以通过函数levels(factor)来查看:

    > levels(student$Gender)
    [1] "F" "M"
    

    水平的级数,相当于level的长度,可以由nlevels函数查询到:

    > nlevels(student$Gender)
    [1] 2
    

    使用factor函数创建因子,可以使用labels参数为每个因子水平添加标签,labels参数的字符顺序,要和levels参数的字符顺序保持一致,例如:

    > sex <- factor(c('f','m','f','f','m'),levels=c('f','m'),labels=c('female','male'),ordered=TRUE)
    > sex
    [1] female male   female female male  
    Levels: female < male
    

    3.有序因子

    通常情况下,因子一般是无序的,这可以通过is.ordered()函数来验证:

    > sex <- factor(c('f','m','f','f','m'),levels=c('f','m'),labels=c('female','male'),ordered=TRUE)
    > is.ordered(sex)
    [1] TRUE
    

    因子的顺序,实际上是指因子水平的顺序,有序因子的因子水平是有序的。在特殊情况下,有些因子的水平在语义上大于或小于其他水平,R支持按顺序排列的因子,使用ordered函数,或通过给factor函数传入order=TRUE参数,把无序因子转换为有序的因子。

    ordered()函数不能指定特定因子水平的顺序,通常情况下,因子中先出现的水平小于后出现的水平。例如,通过ordered函数把sex因子转换为有序的因子:

    > sex <- factor(c('f','m','f','f','m'),levels=c('f','m'))
    > ordered(sex)
    [1] f m f f m
    Levels: f < m
    

    通过factor函数创建有序因子,通过levels指定因子的顺序。

    > sex <- factor(c('f','m','f','f','m'),levels=c('f','m'),ordered=TRUE)
    > sex
    [1] f m f f m
    Levels: f < m
    

    因子的顺序,其实是因子水平的顺序,我们可以通过levels,使现有的因子按照指定的因子水平来排序。

    例如,把heights数据框的gender,按照指定的levels,转换成有序因子:

    > heights <- data.frame(height_cm=c(156,182,170),gender=c('f','m','f'))
    > heights 
      height_cm gender
    1       156      f
    2       182      m
    3       170      f
    > heights$gender
    [1] f m f
    Levels: f m
    > heights$gender <- factor(heights$gender, levels=c('m','f'),ordered=TRUE)
    > heights
      height_cm gender
    1       156      f
    2       182      m
    3       170      f
    > heights$gender
    [1] f m f
    Levels: m < f
    

    4. 删除因子水平

    在数据清理时,可能需要去掉与因子水平对应的数据,通常情况下,需要删除未使用的因子水平,可以使用droplevels函数,它接受因子或是数据框作为参数。

    ## S3 method for class 'factor'
    

    如果x是数据框,那么把数据框中未使用的因子删除。

    heights$gender <- droplevels(heights$gender)
    

    5.把因子水平转换为字符串

    在数据清理中,有时需要把因子转换为字符,通常情况下,使用as.character()函数,把因子转换为字符串:

    > as.character(heights$gender)
    

    6.把因子转换成相应的整数

    使用as.numeric()或as.integer()函数可以把因子转换成对应的整数.

    > as.integer(sex)
    

    7.把连续变量分割为类别

    函数cut()能够把数值变量切成不同的块,然后返回一个因子.

    cut(x, breaks, labels = NULL)
    

    参数注释:

    • x:数值变量
    • breaks:切割点向量
    • labels:每一个分组的标签

    例如,把身高数据,按照指定的切割点向量分割:

    cut(heights$height_cm,c(150,170,190))
    

    8.修改数据框中的因子一般情况下,数据框中的字符类型的列会转换为因子类型,要修改因子类型,一般通过三步来完成:

    mydata$Category <- as.character(mydata$Category)
    

    当需要把因子转换为有序因子时,要注意因子水平的顺序.

    mydata$Category <- as.factor(mydata$Category, levels=c('your ordered'), ordered=TRUE)
    

    相关文章

      网友评论

        本文标题:R语言基础教程 | 数据结构—因子

        本文链接:https://www.haomeiwen.com/subject/ypxeeltx.html