R语言(5)——因子

1 因子

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

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

1.2 创建因子

#方法一
> x<-c(10,8,12,10)
> xf<-factor(x)
> xf
[1] 10 8  12 10
Levels: 8 10 12
#方法二:规定levels
> xff<-factor(x,levels=c(8,10,12,15))
> xff
[1] 10 8  12 10
Levels: 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 income
1      M  49   5000
2      F  20   6000
3      F  30   8000
4      F  35   4000
5      M  18  10000
6      M  19   4000

> d$ifOver30=ifelse(d$age>30,1,0)
> d
  gender age income ifOver30
1      M  49   5000        1
2      F  20   6000        0
3      F  30   8000        0
4      F  35   4000        1
5      M  18  10000        0
6      M  19   4000        0

> class(d$ifOver30)
[1] "numeric"
> class(d$gender)
[1] "factor"

> tapply(d$income,list(d$ifOver30,d$gender),mean)
     F    M
0 7000 7000
1 4000 5000


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

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

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

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

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


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


2.2 split()函数

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

例子

> d
  gender age income ifOver30
1      M  49   5000        1
2      F  20   6000        0
3      F  30   8000        0
4      F  35   4000        1
5      M  18  10000        0
6      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
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值