因子(factor)是R语言中比较特殊的一个数据类型, 它是一个用于存储类别的类型,举个例子,从性别上,可以把人分为:男人和女人,从年龄上划分,又可以把人分为:未成年人(<18岁),成年人(>=18)。R把表示分类的数据称为因子,因子的行为有时像字符串,有时像整数。因子是一个向量,通常情况下,每个元素都是字符类型,也有其他数据类型的元素。因子具有因子水平(Levels),用于限制因子的元素的取值范围,R强制:因子水平是字符类型,因子的元素只能从因子水平中取值,这意味着,因子的每个元素要么是因子水平中的字符(或转换为其他数据类型),要么是缺失值,这是因子的约束,是语法上的规则。

一,创建因子

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

例如,创建一个数据框变量,通过class()函数检查gender列的类,结果是因子类型,而不是字符向量:

heights <- data.frame(height_cm=c(156,182,170),gender=c('f','m','f')
)
> class(heights$gender)
[1] "factor"

还可以通过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

二,因子水平

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

> heights$gender
[1] f m f
Levels: f m

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

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

1,查看因子水平

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

> levels(heights$gender)
[1] "f" "m"

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

> nlevels(heights$gender)
[1] 2

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

三,有序因子

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

> is.ordered(sex)
[1] FALSE

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

1,通过ordered()函数把现有因子转换为有序因子

ordered()函数不能指定特定因子水平的顺序,通常情况下,因子中先出现的水平小于后出现的水平。

例如,通过ordered函数把sex因子转换为有序的因子:

> ordered(sex)
[1] f m f f m
Levels: f < m

2,创建有序的因子

通过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

3,按照指定的顺序转换现有的因子

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

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

heights$gender <- factor(heights$gender, levels=c('m','f'),ordered=TRUE)

四,删除因子水平

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

## S3 method for class 'factor'
droplevels(x, exclude = if(anyNA(levels(x))) NULL else NA, ...)
## S3 method for class 'data.frame'
droplevels(x, except, exclude, ...)

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

heights$gender <- droplevels(gender)

五,把因子水平转换为字符串

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

> as.character(heights$gender)
[1] NA  "m" "f"

或者使用其他类型转换函数,把因子转换为特定的数据类型。

六,把因子转换成相应的整数

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

> as.integer(sex)
[1] 1 2 1 1 2

七,把连续变量分割为类别

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

cut(x, breaks, labels = NULL)

参数注释:

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

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

cut(heights$height_cm,c(150,170,190))
[1] (150,170] (170,190] (150,170]
Levels: (150,170] (170,190]

八,修改数据框中的因子

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

mydata$Category <- as.character(mydata$Category)
mydata <- within(mydata,{Category[Category=="old name"] <- "new name"})
mydata$Category <- as.factor(mydata$Category)

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

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

参考文档:

如何理解R中因子(factor)的概念?

R学习 第九篇:因子相关推荐

  1. Python学习第九篇:zipfile 库操作压缩包

    ​ Python学习第九篇:zipfile 库操作压缩包 -- 活动地址:CSDN21天学习挑战赛 zipfile是python里用来做zip格式编码的压缩和解压缩的 zipfile里有两个非常常用的 ...

  2. python中for和while区别_Python学习第九篇——while和for的区别

    1 pets = ['dog','cat','dog','goldfish','cat','rabbit','cat']2 print(pets)3 for pet inpets:4 print(pe ...

  3. Hive 史上最全面的大数据学习第九篇(五) Hive 自定义函数 每一天都是美好的一天!

    Hive概述 & 安装方式详解 Hive表操作 Hive表分类 Hive Sql 操作 Hive 自定义函数 Hive On HBase 六.Hive 自定义函数 在Hive当中又系统自带的函 ...

  4. android Telephony学习 --- 第九篇 USSD简介

    USSD在国内并不常用,但是海外某些地区还在使用,本人对此理解有限,仅简要介绍下USSD是什么,功能是什么等基本知识,希望可以帮助了解此功能. USSD全称是什么? USSD功能是什么? USSD格式 ...

  5. JavaScript 设计模式学习第九篇- 抽象工厂模式

    工厂模式 (Factory Pattern),根据输入的不同返回不同类的实例,一般用来创建同一类对象.工厂方式的主要思想是将对象的创建与对象的实现分离. 抽象工厂 (Abstract Factory) ...

  6. 第九篇:强化学习Q-learning算法 通俗介绍

    你好,我是郭震(zhenguo) 今天介绍强化学习第九篇:Q-learning算法 前面我们介绍强化学习基本概念,马尔科夫决策过程,策略迭代和值迭代,这些组成强化学习的基础. 从今天开始逐步介绍常用强 ...

  7. VUE源码学习第一篇--前言

    一.目的 前端技术的发展,现在以vue,react,angular为代表的MVVM模式以成为主流,这三个框架大有三分天下之势.react和angular有facebook与谷歌背书,而vue是以一己之 ...

  8. 学习 spring-cloud-aibaba第九篇,综合应用微信小程序《背诗词》

    文章目录 1.背诗词小程序界面和功能点 1.1 界面展示 1.2 功能介绍 2.架构图 2.1 理想中架构图 2.2 实际上的架构图 3 代码开源 4 线上体验 5.披过的荆斩过的棘 6.存在的不足 ...

  9. python中factor函数_左手用R右手Python系列——因子变量与分类重编码

    原标题:左手用R右手Python系列--因子变量与分类重编码 欢迎关注天善智能 hellobi.com,我们是专注于商业智能BI,大数据,数据分析领域的垂直社区,学习.问答.求职,一站式搞定! 对商业 ...

  10. 强化学习基础篇(五):Dyna-Q 算法

    强化学习基础篇(五):Dyna-Q 算法 (Dynamic Programming) 1. 简介 2. Dyna-Q 3. Dyna-Q 代码实践 4. 小结 文章转于 伯禹学习平台-动手学强化学习 ...

最新文章

  1. 【CSON原创】HTML5游戏框架cnGameJS开发实录(外部输入模块篇)
  2. 176页报告辟谣自动化时代的就业危机(附下载)
  3. 【COGS】2287:[HZOI 2015]疯狂的机器人 FFT+卡特兰数+排列组合
  4. python扫雷代码_室友扫雷通关来炫耀!我用Python做出自动扫雷十秒通关!
  5. 常用sql-----DDL语句
  6. Ubuntu18.04安装常用软件
  7. Visual C++——《可视化编程技术》实验报告——资源的应用—反弹的球
  8. JAVA——Scanner读取文件
  9. Hadoop的伪分布安装 hadoop的核心思想
  10. 怎么把c语言转换汇编程序,如何把汇编语言转换成C语言
  11. 组态王能直接读取仪表数据吗_液晶多功能网络电力仪表PD800H
  12. php 发送delete请求,PHP中使用CURL实现GET、POST、PUT、DELETE请求
  13. 网络爬虫模拟登陆获取数据并解析实战(二)
  14. PTA c语言 冒泡法排序
  15. C#等同于正则表达式的写法
  16. 【毕业设计/Matlab系列】基于matlab的线性调频信号的仿真
  17. WSL2 网络异常排查 [ping 不通、网络地址异常、缺少默认路由、被宿主机防火墙拦截]
  18. 网页游戏防外挂策略。
  19. 解决excel转pdf出现的折行问题
  20. java免费浏览器,Java swing实现简单的浏览器源码免费分享

热门文章

  1. snake与LunarLander源代码分析
  2. 遇上与你一样的她(他)| MixLab人工智能
  3. ShapeShift、DAOs和工作的未来
  4. 怎样进行结构化思维思考?
  5. 记录,cents7 关闭防火墙
  6. 希尔伯特几何基础序言
  7. [译]为什么苹果眼镜会没有ARKit——当前AR产品的8大问题
  8. 认知升级三部曲读后感想
  9. AdaBoost算法实例详解
  10. CMD的打开方式以及一些常用的Dos命令