4 排序和非排序因素
因素(Factor)用于表示一个具有相同长度的离散组组的向量的一个向量对象。R提供了排序和非排序的因素。
4.1 一个具体例子
举个例子,我们有一个30个州的的士帐号样本,帐号所属的州由字符串向量state保存:
> state <- c("tas", "sa", "qld", "nsw", "nsw", "nt", "wa", "wa",
"qld", "vic", "nsw", "vic", "qld", "qld", "sa", "tas",
"sa", "nt", "wa", "vic", "qld", "nsw", "nsw", "wa",
"sa", "act", "nsw", "vic", "vic", "act")
简单地通过factor()函数来创建因素:
> statef <- factor(state)
print()函数打印因素的方式与其它对象略有不同,会在最后一行打印出Levels信息。
> statef
[1] tas sa qld nsw nsw nt wa wa qld vic nsw vic qld qld sa
[16] tas sa nt wa vic qld nsw nsw wa sa act nsw vic vic act
Levels: act nsw nt qld sa tas vic wa
可以通过levels()函数来得到因素的级别
>levels(statef)
[1] "act" "nsw" "nt" "qld" "sa" "tas" "vic" "wa"
4.2 tapply()函数和不规则数组
继续上面的例子,假设我们有的士帐号的收入信息,并储存在另一个向量当中
> incomes <- c(60, 49, 40, 61, 64, 60, 59, 54, 62, 69, 70, 42, 56,
61, 61, 61, 58, 51, 48, 65, 49, 49, 41, 48, 52, 46,
59, 46, 58, 43)
为了计算每个州的平均收入,我们可以使用tapply()函数:
> incmeans <- tapply(incomes, statef, mean)
结果为以州级别为标签的平均收入的向量:
act nsw nt qld sa tas vic wa
44.500 57.333 55.500 53.600 55.000 60.500 56.000 52.250
函数tapply()用于将一个函数(这里为mean())应用到第一个参数(这里为incomes)中的每一个元素上,并由第二个参数(这里为statef)的元素级别来定义,就像它们是独立的向量结构。结果是一个和因素级别长度相同的向量。
假设我们需要计算收入均值的标准差。为了达到这个目的,我们需要编写一个R函数来计算每个给定向量的标准差,由于我们有一个内置的函数var()来计算样本标准差,所以该函数将只是简单的一行,并进行赋值如下:
> stderr <- function(x) sqrt(var(x)/length(x))
然后,我们将使用如下命令来计算标准差。
>incster <- tapply(incomes, statef, stderr)
计算结果如下
>incster
act nsw nt qld sa tas vic wa
1.5 4.3102 4.5 4.1061 2.7386 0.5 5.244 2.6575
tapply()函数同样可以用于处理更复杂的由多个类别索引的向量。比如,我们可能希望通过州和性别来对的士帐号进行分割,TODO:待补全
4.3 排序因素
因素的级别(levels)默认按照字母顺序存储,也可以显示指定排列的顺序。有时我们想对级别重新排序以便在统计中能够上,而reorder()函数就是用来创建这种排序因素。