R语法学习 第十二篇:因子
因子(factor)是R语言中比较特殊的一个数据类型, 它是一个用于存储类别的类型,举个例子,从性别上,可以把人分为:男人和女人,从年龄上划分,又可以把人分为:未成年人(<18岁),成年人(>=18)。R把表示分类的数据称为因子,因子的行为有时像字符串,有时像整数。因子是一个向量,通常情况下,每个元素都是字符类型,也有其他数据类型的元素。因子具有因子水平(Levels),用于限制因子的元素的取值范围,R强制:因子水平是字符类型,因子的元素只能从因子水平中取值,这意味着,因子的每个元素要么是因子水平中的字符(或转换为其他数据类型),要么是缺失值,这是因子的约束,是语法上的规则。
一,创建因子
通常情况下,在创建数据框变量时,R隐式把数据类型为字符的列创建为因子,这是因为R会把文本类型默认为类别数据,并自动转换为因子。
例如,创建一个数据框变量,通过class()函数检查gender列的类,结果是因子类型,而不是字符向量:
heights <- data.frame(
height_cm=c(,,),
gender=c('f','m','f')
)
> class(heights$gender)
[] "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
[] f m f f m
Levels: f m
二,因子水平
因子水平规定了因子取值的范围,每一个因子,都包含因子水平的信息,例如,打印gender列,可以看到因子的元素和水平:
> heights$gender
[] f m f
Levels: f m
该因子中的每个值都是一个字符串,它们被限制为“f”、“m”和缺失值(NA)。如果把其他字符串添加到gender列中,R会抛出警告消息,并把错误赋值的元素设置为NA,例如:
> heights$gender[]<-"female"
Warning message:
In `[<-.factor`(`*tmp*`, , value = c(NA, 2L, 1L)) :
invalid factor level, NA generated
1,查看因子水平
因子水平,可以通过函数levels(factor)来查看:
> levels(heights$gender)
[] "f" "m"
水平的级数,相当于level的长度,可以由nlevels函数查询到:
> nlevels(heights$gender)
[]
2,因子水平的标签
使用factor函数创建因子,可以使用labels参数为每个因子水平添加标签,labels参数的字符顺序,要和levels参数的字符顺序保持一致,例如:
> sex=factor(c('f','m','f','f','m'),levels=c('f','m'),labels=c('female','male'),ordered=TRUE)
> sex
[] female male female female male
Levels: female < male
三,有序因子
通常情况下,因子一般是无序的,这可以通过is.ordered()函数来验证:
> is.ordered(sex)
[] FALSE
因子的顺序,实际上是指因子水平的顺序,有序因子的因子水平是有序的。在特殊情况下,有些因子的水平在语义上大于或小于其他水平,R支持按顺序排列的因子,使用ordered函数,或通过给factor函数传入order=TRUE参数,把无序因子转换为有序的因子。
1,通过ordered()函数把现有因子转换为有序因子
ordered()函数不能指定特定因子水平的顺序,通常情况下,因子中先出现的水平小于后出现的水平。
例如,通过ordered函数把sex因子转换为有序的因子:
> ordered(sex)
[] 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
[] 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)
[] NA "m" "f"
或者使用其他类型转换函数,把因子转换为特定的数据类型。
六,把因子转换成相应的整数
使用as.numeric()或as.integer()函数可以把因子转换成对应的整数
> as.integer(sex)
[]
七,把连续变量分割为类别
函数cut()能够把数值变量切成不同的块,然后返回一个因子
cut(x, breaks, labels = NULL)
参数注释:
- x:数值变量
- breaks:切割点向量
- labels:每一个分组的标签
例如,把身高数据,按照指定的切割点向量分割:
cut(heights$height_cm,c(,,))
[] (,] (,] (,]
Levels: (,] (,]
八,修改数据框中的因子
一般情况下,数据框中的字符类型的列会转换为因子类型,要修改因子类型,一般通过三步来完成:
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语法学习 第十二篇:因子的更多相关文章
- 从.Net到Java学习第十二篇——SpringBoot+JPA提供跨域接口
从.Net到Java学习系列目录 最近又撸了半个月的前端代码,做app离线存储,然后又花了一周去将过去的wcf项目转webapi,java又被落下了,总感觉我特么像斗地主中的癞子牌,变来变去..... ...
- Python 学习 第十二篇:pandas
pandas是基于NumPy构建的模块,含有使数据分析更快更简单的操作工具和数据结构,最常用的数据结构是:序列Series和数据框DataFrame,Series类似于numpy中的一维数组,类似于关 ...
- Python学习第十二篇——切片的使用
Python中使用函数切片可以创建副本,保留原本.现在给出如下代码 magicians_list = ['mole','jack','lucy'] new_lists = [] def make_gr ...
- Egret入门学习日记 --- 第十二篇(书中 5.1节 内容)
第十二篇(书中 5.1节 内容) 昨天把 第4章完成了. 今天来看第5章. 接下来是 5.1节 的内容. 总结一下 5.1节 的重点: 1.如何制作一个公用按钮皮肤. 跟着做: 重点1:如何制作一个公 ...
- python3.4学习笔记(十二) python正则表达式的使用,使用pyspider匹配输出带.html结尾的URL
python3.4学习笔记(十二) python正则表达式的使用,使用pyspider匹配输出带.html结尾的URL实战例子:使用pyspider匹配输出带.html结尾的URL:@config(a ...
- 第十二篇 SQL Server代理多服务器管理
本篇文章是SQL Server代理系列的第十二篇,详细内容请参考原文 在这一系列的上一篇,我们查看了维护计划,一个维护计划可能会创建多个作业,多个计划.你还简单地看了SSIS子系统,并查看了维护计划作 ...
- 第十二篇 Integration Services:高级日志记录
本篇文章是Integration Services系列的第十二篇,详细内容请参考原文. 简介在前一篇文章我们配置了SSIS内置日志记录,演示了简单和高级日志配置,保存并查看日志配置,生成自定义日志消息 ...
- Python开发【第二十二篇】:Web框架之Django【进阶】
Python开发[第二十二篇]:Web框架之Django[进阶] 猛击这里:http://www.cnblogs.com/wupeiqi/articles/5246483.html 博客园 首页 ...
- 【译】第十二篇 Integration Services:高级日志记录
本篇文章是Integration Services系列的第十二篇,详细内容请参考原文. 简介在前一篇文章我们配置了SSIS内置日志记录,演示了简单和高级日志配置,保存并查看日志配置,生成自定义日志消息 ...
随机推荐
- EBS 可拓展的外部信用风险导入
DECLARE l_msg_count NUMBER; l_msg_data VARCHAR2(2000); l_return_status VARCHAR2(30); l_cc_hold_comme ...
- 理解WebKit和Chromium: 硬件加速之RenderLayer树到合成树
转载请注明原文地址:http://blog.csdn.net/milado_nju ## 概述 在前面的章节中,笔者介绍了WebKit渲染引擎是如何有HTML网页构建DOM树.RenderObject ...
- Python3.4 + Django1.7.7 搭建简单的表单并提交
后面还有一个问题,是我把txt生成了,但是网页没有返回我还不知道,现在怎么直接返回txt并且展示出来txt 的内容,希望大牛不吝赐教 首先有一个问题 django1.7之前,这样用: HttpResp ...
- 2015年北京的第一场雪-关于android学习的思考(84)
今天是2015年11月6日,今天北京下了大雪,我听着民谣,发现丢火车的摇滚也还不错,我身体的一部分毛发也发生了变异,由黑色变成红色,一切来的太突然了......不知不觉学习android开发2年多了, ...
- AngularJS进阶(二十三)ANGULAR三宗罪之版本陷阱
ANGULAR三宗罪之版本陷阱 坑!碰到个大坑,前面由于绑定日期时将angular版本换为angular-1.3.0-beta.1时,后来午睡后,登录系统,发现无论如何都登陆不进去了,经过调试,发现数 ...
- Leetcode_114_Flatten Binary Tree to Linked List
本文是在学习中的总结,欢迎转载但请注明出处:http://blog.csdn.net/pistolove/article/details/42744919 Given a binary tree, f ...
- 将studio项目 转换为eclipse项目
总会有些奇怪的事情,比如,有的人就有将studio项目 转换为eclipse项目的需求 首先,不要因为编译原因而放弃.studio项目是完全可以转换成eclipse的 本站的开源代码板块有很多项目都是 ...
- OpenCV 实现颜色直方图
颜色直方图是在许多图像检索系统中被广泛采用的颜色特征.它所描述的是不同色彩在整幅图像中所占的比例,而并不关心每种色彩所处的空间位置,即无法描述图像中的对象或物体.颜色直方图特别适于描述那些难以进行自动 ...
- 《java入门第一季》之面向对象(this和super详细分析)
此文章来自于书籍,里面介绍了this和super详细的区别.当然在后边的文章中还有涉及super的时候还会分析. Java关键字this.super使用总结 一.this Java关键字this只能用 ...
- Leetcode_202_Happy Number
+ 92 = 82 82 + 22 = 68 62 + 82 = 100 12 + 02 + 02 = 1 思路: (1)题意为判断给定的整数是否为一个"快乐的数",所谓快乐的数需 ...