因子
因子 (factor) 是 R 语言中许多强大运算的基础,包括许多针对表格数据的运算。因子的设计思想来源于统计学中的名义变量,或称之为分类变量,这种变量本质上不是数字,而是对应为分类。
因子可以看成是包含了额外信息的向量,这额外的信息就是不同的类别,称之为水平 (level)。
> x <- c(5,12,13,12)
> xf <- factor(x)
> xf
[1] 5 12 13 12
Levels: 5 12 13
> # 因子的长度是其中元素数量,而不是水平数量
> length(xf)
[1] 4
因子的常用函数
tapply() 函数典型用法:tapply(x,f,g) x 是向量,f 是因子或因子列表,g 是函数,将 x 向量按照 f 因子水平进行分组,然后对每组应用 g 函数。
> ages <- c(25,26,55,37,21,42)
> affils <- c("R","D","D","R","U","D")
> tapply(ages, affils, mean)
D R U
41 31 21
split() 函数,tapply() 函数是将向量按因子水平分组,然后对每个子向量应用函数,而 split() 函数只是分组,不过可以对向量分组,也可以对数据框分组。
> d
gender age income over25
1 M 47 55000 1
2 M 59 88000 1
3 F 21 32450 0
4 M 32 76500 1
5 F 33 123000 1
6 F 24 45650 0
> split(d$income, list(d$gender,d$over25))
$F.0
[1] 32450 45650
$M.0
numeric(0)
$F.1
[1] 123000
$M.1
[1] 55000 88000 76500
by() 函数,使用方式与 tapply() 类似,但是 tapply() 只能用于向量,而 by() 可以用于向量和数据库,实际 by() 函数在内部调用了 tapply() 函数。by() 第一个参数指定数据(可以是向量或数据框),第二个参数为分组因子,第三个参数为函数。
R 中的表
R 中的表可以看做是一个因子列表的频数表,统计学中称为列联表,用函数 table() 来生成表:
> fl <- list(x=c(5,7,9,7,9,5,9),y=c("a","b","a","a","b","a","a"))
> fl
$x
[1] 5 7 9 7 9 5 9
$y
[1] "a" "b" "a" "a" "b" "a" "a"
> table(fl)
y
x a b
5 2 0
7 1 1
9 2 1
这个例子中的因子列表只有两列,生成一个二维表,如果有三列因子,则生成一个三维表(联想三维数组)。
表中有关矩阵和类似数组的操作
多数矩阵和数组的运算可以用在数据框上,同时也适用于表,因为表对象中单元格频数部分就是数组。
> ct
vote.for.X vote.for.X.last.time
1 Yes Yes
2 Yes No
3 No No
4 NotSure Yes
5 No No
> cttab <- table(ct)
> cttab
vote.for.X.last.time
vote.for.X No Yes
No 2 0
NotSure 0 1
Yes 1 1
> cttab[1,1]
[1] 2
> cttab[1,2]
[1] 0
> cttab[1,]
No Yes
2 0
> cttab[,1]
No NotSure Yes
2 0 1
> addmargins(cttab)
vote.for.X.last.time
vote.for.X No Yes Sum
No 2 0 2
NotSure 0 1 1
Yes 1 1 2
Sum 3 2 5
> dimnames(cttab)
$vote.for.X
[1] "No" "NotSure" "Yes"
$vote.for.X.last.time
[1] "No" "Yes"
与因子和表有关的函数
aggregate() 函数对分组中的每一个变量调用 tapply() 函数。
cut() 函数是生成因子的一种常用方法,cut(x, b, labels=FALSE),x 是一个数据向量,向量 b 定义了一组区间,函数将确定 x 向量中每个元素落入 b 中的哪个区间。
> z
[1] 1.1 3.5 2.0 6.8 7.4 7.7 2.2
> b <- seq(1,10,0.5)
> b
[1] 1.0 1.5 2.0 2.5 3.0 3.5 4.0 4.5 5.0 5.5 6.0 6.5 7.0 7.5 8.0
[16] 8.5 9.0 9.5 10.0
> cut(z,b,labels=F)
[1] 1 5 2 12 13 14 3
b 向量确定的区间为半开半闭区间 (b[1],b[2]], (b[2],b[3]], ……
b[1] < 区间 <= b[2]
尊重人不应该胜于尊重真理。--柏拉图