原文链接:如何理解R中因子(factor)的概念?
作者:Sanyo
链接:https://www.zhihu.com/question/48472404/answer/455193433
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
一、定义
标准定义: 因子用来存储类别变量和有序变量,这类变量不能用来计算而只能用来分类或者计数。举个例子来看。我们在取用数据的时候,肯定会有很多维度,比如我在整理某个事件的媒体传播情况,会有这些维度:标题、媒体、网址、阅读量等等。
这些维度里面,有文本格式的,也有数字格式的。这个时候因子的概念就引入了,我把这些不管是文本格式的数据列还是数字格式的数据列,都可以统一包装成因子数据格式,差不多就可以这么理解它。(后面讲为什么要这么做)
二:简要介绍一下因子
你可以这么创建一个因子:
factor(x = character(), levels, labels = levels,exclude = NA, ordered = is.ordered(x), nmax = NA)
因为我们只是为了理解这东西,所以先只看levels和labels这两个参数。
首先是因子水平levels,下面我创建一个新闻的来源维度,w代表微信,m代表网媒:
source<- factor(c('w','w','m','m','m'),levels=c('w','m'))
因子source的值是向量c(‘w’,‘w’,‘m’,‘m’,‘m’),因子水平是c(‘w’,‘m’),打印出来是这个样子:
这里的levels规定了因子的取值范围,如果我在创建值向量中多一个levels范围外的“y”,他就显示不出来了,显示为<NA>
然后是因子水平的标签labels,使用factor函数创建因子,可以使用labels参数为每个因子水平添加标签,labels参数的字符顺序,要和levels参数的字符顺序保持一致,例如:
source<- factor(c('w','w','m','m','m'),levels=c('w','m'),labels=c('weixin','media'))
然后他会是这样的:
三、为什么要这么设定,因子有什么用?
因子其实是把序列中的数据看成是一个类别、等级,或者说就是一个点,比如媒体,可以有网媒、微信,阅读量,本身是个连续的数据,这里每一个阅读量,都被看成一个类别(虽然这类数值不适合作为类别,更适合作为连续数值处理)
类别数据,可以帮你查看有哪些类别:
查看有多少类别:
具体应用中还有很多用,本文只为了了解,所以不继续展开。
四、实际操作中遇到过的坑:
在创建具有文本数据列的任何数据框时,R语言将文本列视为分类数据并在其上创建因子。这就是为什么,我们读取CSV或者EXCEL时,经常莫名其妙读进来的是因子,完全不知道怎么处理。你可以用str()先查一下数据是什么格式的,比如我的source就是factor因子:
所以怎么办呢?第一个办法,比如读取CSV的时候,在后面加上stringsAsFactors = FALSE,读出来的数据就不会转换成因子格式了:
data2 <- read.csv("文件路径",sep=",",header = FALSE,stringsAsFactors = FALSE)
第二个方法,读进来之后内容也是可以转的,直接用as.character()就可以将数据转成文本:
介绍到这里,一般的使用应该是没问题了。