factor()
factor(x, levels = sort(unique(x), na.last = TRUE), labels, exclude = NA, ordered = FALSE)
- 可以自行指定各离散取值水平(levels),不指定时由x的不同值来求得。
- labels可以用来指定各水平的标签,不指定时用各离散取值的对应字符串。
- exclude参数用来指定要转换为缺失值(NA)的元素值集合。
- ordered取真值时表示因子水平(Levels)是有次序的。
- 可以用is.factor()检验对象是否因子,用as.factor()把一个向量转换成一个因子。
##example1
> x<-c(4, 2, 2, 3);
> y<- factor(x);
[1] 4 2 2 3
Levels: 2 3 4
> factor (x, order=T);
[1] 4 2 2 3
Levels: 2 < 3 <4 # Levels 会有序排列
> factor(x,label=c("red", "black","white"))
[1] white red red black # red代表2,black代表3,white代表4
Levels: red black white
> factor(x,label=c("red","black","white"),order=T);
[1] white red red black
Levels: red < black < white
> factor(x, exclude=3,order=T);
[1] 4 2 2 <NA>
Levels: 2 < 4
> x<- c(1,0,1,1,0); >y=factor(x,levels=sort(unique(x),decreasing=T),labels=c("男", "女"), order=F);
> y
[1] 男 女 男 男 女
Levels: 男 女
##example2
> x<-c(1,0,1,1,0,2);
> y=factor(x,levels=c(1,0), labels=c("男", "女"), order=F)
> y
[1] 男 女 男 男 女 <NA>
Levels: 男 女
- 可以用两个或多个因子进行交叉分类。比如,性别(sex)和职业(job)交叉分组可以用table(sex, job)来统计每一交叉类的频数,结果为一个矩阵,矩阵带有行名和列名,分别为两个因子的各水平名。
> job=factor(c("teacher", "worker","worker", "worker","teacher"));
> sex = factor(c("男", "女", "男", "男", "女"));
> table(sex, job);
运行结果
job
sex teacher worker
男 1 2
女 1 1
三维:
> age=factor(c("old","old", "young","old","young"));
> table(sex, job, age);
运行结果
`
tapply(X, INDEX, FUN = NULL, …, default = NA, simplify = TRUE)
- X是向量;INDEX是和X同等长度的因子
- FUN是要执行的函数
- simplify取默认的TRUE,返回一个标量,取FALSE时,返回一个列表list
> sex = factor(c("男", "女", "男", "男", "女")) ;
> h <- c(165, 170, 168, 172, 159)
> tapply(h, sex, mean);
运行结果:
男 女
168.3333 164.5000
> tapply(h, sex, mean, simplify=F)
$男
[1] 168.3333
$女
[1] 164.5
gl()
gl(n, k, length=n*k, labels=1:n, ordered=FALSE)
- n是水平数
- k为重复的次数
- length是结果的长度
- labels是一个n维向量,表示因子的水平
- ordered是逻辑变量,表示是否为有序因子,默认值为FALSE
> gl(3,5)
[1] 1 1 1 1 1 2 2 2 2 2 3 3 3 3 3
Levels: 1 2 3
> gl(3,1,9)
[1] 1 2 3 1 2 3 1 2 3
Levels: 1 2 3
> gl(3,1,8,labels=c("red","blue","white"))
[1] red blue white red blue white red blue
Levels: red blue white