R语言(5)——因子

来源:互联网 发布:简历封面 知乎 编辑:程序博客网 时间:2024/06/10 14:09

1 因子

1.1 因子含义:R预言中的因子(factor)的设计思想来源于统计学中的名义变量(nominal variables),或称为分类变量。

例如年龄中的:幼年、青年、中年、老年。这一类变量本质上不是数字,但是可以用数字为其编码、存储。

1.2 创建因子

#方法一> x<-c(10,8,12,10)> xf<-factor(x)> xf[1] 10 8  12 10Levels: 8 10 12#方法二:规定levels> xff<-factor(x,levels=c(8,10,12,15))> xff[1] 10 8  12 10Levels: 8 10 12 15


上面方法二出现了levels(水平),那么什么是水平呢?

说为水平就是指一个名义变量(也就是R中的因子变量了)可能能取到的所有值。比如,年龄这个变量,“幼年、青年、中年、老年”这四个值时变量可能取到的。但如果我们到一所大学里做调研,被调查的人都是大学生,都是青年或中年,那么在这组样本里就没有出现幼年和老年。但我们是允许“幼年、老年”这样的值出现的。

1.3 因子的本质

> ages<-c("青年","中年","青年","中年","中年","青年")> fages<-factor(ages,levels=c("幼年","青年","中年","老年"))> fages[1] 青年 中年 青年 中年 中年 青年Levels: 幼年 青年 中年 老年> str(fages) Factor w/ 4 levels "幼年","青年",..: 2 3 2 3 3 2


注意上面代码段中最后一行,我们可以看到在R中,其实每个level用一个整数来表示、存储,虽然我们看到的依然是“青年”,“中年”,但在R中其本质是1,2,3这样的整数。



2 常用函数

2.1 tapply() 按因子分组统计

tapply(m,n,f)

其中,m为待统计的数据,n为m中数据对应的因子,f为对m按n分组使用的函数。tapply函数根据n的类别,将向量m分割为一个一个的组,在针对每一组使用f函数。

注意m只能为向量。


例子

> d<-data.frame(list(gender=c("M","F","F","F","M","M")),age=c(49,20,30,35,18,19),income=c(5000,6000,8000,4000,10000,4000))> d  gender age income1      M  49   50002      F  20   60003      F  30   80004      F  35   40005      M  18  100006      M  19   4000> d$ifOver30=ifelse(d$age>30,1,0)> d  gender age income ifOver301      M  49   5000        12      F  20   6000        03      F  30   8000        04      F  35   4000        15      M  18  10000        06      M  19   4000        0> class(d$ifOver30)[1] "numeric"> class(d$gender)[1] "factor"> tapply(d$income,list(d$ifOver30,d$gender),mean)     F    M0 7000 70001 4000 5000

上面的例子中,我们首先创建了一个数据框,这个数据框包含六名工作者的年龄,性别,工资。我们希望考察:

30岁以上男性工作者的平均工资;

30岁以下男性工作者的平均工资;

30岁以上女性工作者的平均工资;

30岁以下女性工作者的平均工资;


因此我们应用tapply()函数,通过ifOver30和gender这列来进行分组,进而对各组数据的income数据应用mean函数,从而得到结果。


2.2 split()函数

split(m,n)函数做了tapply中的第一部工作:将向量m按照n分组,并输出分组。

例子

> d  gender age income ifOver301      M  49   5000        12      F  20   6000        03      F  30   8000        04      F  35   4000        15      M  18  10000        06      M  19   4000        0> dd<-split(d$income,list(d$ifOver30,d$gender))> dd$`0.F`[1] 6000 8000$`1.F`[1] 4000$`0.M`[1] 10000  4000$`1.M`[1] 5000> dd["0.F"]$`0.F`[1] 6000 8000> dd$"0.F"[1] 6000 8000




0 0
原创粉丝点击