R 学习笔记(5) -- 因子和表

因子

因子 (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]

尊重人不应该胜于尊重真理。–柏拉图

    原文作者:wangpeng905
    原文地址: https://www.jianshu.com/p/5fd714f3a694
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞