变量可归结为名义型、有序型或连续型变量。名义型变量是没有顺序之分的类别变量。有序型变量表示一种顺序关系,而非数量关系。连续型变量可以呈现为某个范围内的任意值,并同时表示了顺序和数量。
类别(名义型)变量和有序类别(有序型)变量在R中被称为因子(factor)。因子在R中非常重要,因为它决定了数据的分析方式以及如何进行视觉呈现。
因子是R语言中许多强大运算的基础,包括许多针对表格数据的运算。因子设计思想来源于统计学中的名义变量(nominal variables),或称之为分类变量(categorical variables),这种变量本质上不是数字,而是对应为分类。因子是一个对等长的其他向量元素进行分类(分组)的向量对象。R同时提供有序和无序两种因子。而“真正”使用因子是在模型设计公式的时候。
在R中,因子可以简单地看作一个附加了更多信息的向量(尽管它们内部机理是不同的)。这额外的信息包括向量中不同值的记录,称为“水平(level)”。
函数factor()以一个整数向量的形式存储类别值。整数的取值范围是[1…k](其中k是名义型变量中唯一值的个数),同时一个由字符串(原始值)组成的内部向量将映射到这些整数上。
> x <- c( 5, 12, 13, 12 )
> xf <- factor( x )
> xf
[1] 5 12 13 12
Levels: 5 12 13
> str( xf )
Factor w/ 3 levels "5","12","13": 1 2 3 2
> unclass( xf )
[1] 1 2 3 2
> attr(,"levels")
[1] "5" "12" "13"
注:这是具有启发性的。这里xf的核心不是( 5, 12, 13, 12 ),而是(1, 2, 3, 2)。后者意味着我们的数据是由水平1的值、接着水平2和水平3的值,最后是水平2的值构成。因此数据已经重新编码为水平。当然水平本身也被记录,尽管是记作字符。
因子的长度定义为数据的长度,而不是水平的个数。
> length( xf )
[1] 4
我们也可以提前插入新的水平,如下:
> x <- c( 5, 12, 13, 12 )
> xf <- factor( x, levels=c( 5, 12, 13, 88 ) )
> xf
[1] 5 12 13 12
Levels: 5 12 13 88
> xf[2] <- 88
> xf
[1] 5 88 13 12
Levels: 5 12 13 88
最初,xf不包含值88,但在定义它的时候,我们就允许了将来这种可能性,接下来,我们就可以添加这个值。因此,不能添加一个“非法”的水平,如下:
> xf[2] <- 28
Warning message:In `[<-.factor`(`*tmp*`, 2, value = 28) : invalid factor level, NA generated
> xf
[1] 5 <NA> 13 12
Levels: 5 12 13 88
注:应保证指定的水平与数据中的真实值相匹配,因为任何在数据中出现而未在参数中列举的数据都将被设为缺失值。
普通因子和有序因子的不同会影响数据分析。
> patientID <- c( 1, 2, 3, 4 )
> ages <- c( 25, 34, 28, 52 )
> diabetes <- c( "type1", "type2", "type1", "type1" )
> status <- c( "Poor", "Improved", "Excellent", "Poor" )
> diabetes <- factor( diabetes )
> status <- factor( status, order=TRUE )
> patient <- data.frame( patientID, ages, diabetes, status )
> str( patient ) #显示对象的结构
'data.frame':4 obs. of 4 variables:
$ patientID: num 1 2 3 4
$ ages : num 25 34 28 52
$ diabetes : Factor w/ 2 levels "type1","type2": 1 2 1 1
$ status : Ord.factor w/ 3 levels "Excellent"<"Improved"<..: 3 2 1 3
> summary( patient ) #显示对象的统计概要
patientID ages diabetes status
Min. :1.00 Min. :25.00 type1:3 Excellent:1
1st Qu.:1.75 1st Qu.:27.25 type2:1 Improved :1
Median :2.50 Median :31.00 Poor :2
Mean :2.50 Mean :34.75
3rd Qu.:3.25 3rd Qu.:38.50
Max. :4.00 Max. :52.00
►有序因子
因子的水平是以字母顺序排列的,或者显式地在factor中指定。
有时候因子的水平有自己的自然顺序并且这种顺序是有意义的。函数ordered()就是用来创建这种有序因子。在其他方面,函数ordered()和factor基本完全一样。在大多数情况下,有序和无序因子的唯一差别在于前者显示的时候反应了各水平的顺序。另外,在线性模型拟合的时候,两种因子对应的对照矩阵的意义完全不同。