因子
因子定义
因子(factor):是名义型变量或有序型变量,比较特殊。一个因子不仅包括分类变量本身还包括变量不同的可能水平(即使它们在数据中不出现)。
factor()用法
factor (x,levels=sort(unique(x),na.last=TRUE), labels=lebels, exclude=NA, ordered=is.order (x))
其中,levels用于指定因子的可能水平,labels用于定义水平的名字;exclude指从向量x中剔除的水平值,ordered指因子的水平是否要排序,例如:
|
|
从上面的结果可以看出,这组数据中有3个数据,3个水平,分别为1,2,3。还有一种情况是,水平数大于实际的数据数,如下所示:
|
|
这组数据中有3个数据,有5个水平(其中两个水平没出现)。
factor数据的名称
|
|
c有三个水平,名字分别为a,b,c
将factor转化为其它类型
数值型
|
|
字符型
|
|
将factor转换为数值
|
|
上述命令将fac(1,10)先转化为字符型,接着将字符型转化为数值型,如果直接将factor转换为numeric,容易出错,一般情况下就是先看factor转换为character,再转换为numeric。
将其它数据转换为factor
将字符转换为因子
|
|
将数值转换为因子
|
|
提取可能的factor
|
|
将连续型数据转换factor
以PlantGrowth
数据集为例说明,先看一下这个数据集:
|
|
在这个案例中,我们使用cut()
函数把一个连续型变量weight
转化为分类变量wtclass
,如下所示:
|
|
我们为三个类设定了四个边界值,边界值可以包括正无穷(Inf)和负无穷(-Inf),如果一个值落在我们规定的区间外,它的类别将被设定为NA(缺失值),cut()
函数的结果是一个因素,并且因子水平的名称是以生成的区间命名的,如下所示:
|
|
但是这个区间名称明显不太方便,我们可以更改一下,如下所示:
|
|
cut()
函数生成的区间是左开右闭的,换句话说,它们不会包含最小值,但是它们包含了最大值,对于值最小的一类,可以通常设置参数include.lowest=TRUE
来实现,这样它们就能同时包含最小值和最大值了,如果要让生成的区间是左闭右开的,需要设定参数right=FALSE
,如下所示:
|
|
如果要更改不同因子的名称,例如将Small改为A,Medium改为B,Large改为C,那么就需要car中的recode函数,如下所示:
|
|
生成指定的factor
seq()
在R的向量笔记中,提到了seq()函数用来生成某一条件的向量,这个函数在生成特定因子方面也有很重要的作用,用法为seq(length=, from=, to=)
,其中,length:指定生成个数,from:是指开始生成的点,to:截止点。如下所示:
|
|
rep()
用法:rep(P,N)
,表示重复生成P值N次,例如rep(a1:a2,a1:a2) #重复a1到a2,按a1产生a1次,按a2产生a2次,如下所示:
|
|
gl函数
生成规则的因子序列,gl(k,n):k为水平数据,n是每个水平重复的次数。如下所示:
|
|
有序因子
因子没有顺序,但也可以人为指定顺序。例如糖尿病类型Diabetes(Type1,Type2),就是2种类型没有顺序,但病人状态status(Poor,Imporved,Excellent)是有顺序的。案例如下:
|
|
注:字符型向量的因子水平默认依字母顺序创建。但在实际情况中并不常用,而是通过levels选项来指定因子顺序,使用factor(status, order = TRUE, levels = c(“Poor”, “Improved”, “Excellent”)),各个水平的赋值就为1 = Poor, 2 = Improved, 3 = Excellent。或者是通过下面代码实现:
|
|
factor的统计
如果一组数据有多个重复值,例如美国的每一个州都位于4个区域的中某一个,分别为东北,南、中北和西,则我们看一下内置的state数据集:
|
|