►tapply()函数
在典型的用法中,调用tapply(x,f,g)需要向量x、因子或因子列表f以及函数g。Tapply()执行的操作是,(暂时)将x分组,每组对应一个因子水平(或在多重因子的情况下对应一组因子水平的组合),得到x的子向量,然后这些子向量应用函数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
如果有两个或两个以上的因子,则每个因子将产生一系列的组,这些组会被结合在一起,如下:
> 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
> d <- data.frame( list( gender=c( "M","M", "F", "M", "F", "F" ),
+ age=c( 47, 59, 21, 32, 33, 24 ),
+ income=c( 55000, 88000, 32450, 76500, 123000, 45650 ) ) )
> d
gender age income
1 M 47 55000
2 M 59 88000
3 F 21 32450
4 M 32 76500
5 F 33 123000
6 F 24 45650
> d$over25 <- ifelse( d$age > 25, 1, 0 )
> 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
> tapply( d$income, list( d$gender, d$over25 ), mean )
0 1
F 39050 123000.00
M NA 73166.67
►split()函数
tapply()是将向量分割为组,然后针对每个分组应用指定的函数,与之不同的是,split()在第一步就停止了,只是形成分组。
split()的基本形式是:split( x,f ),这里的x和f与tapply(x,f,g)中的x和f的意义类似,即x为向量或数据框,f为因子或因子的列表。该函数可以把x划分为组,并返回分组的列表。
注:x在split()中可以说数据框,而在tapply()中不可以。
> d <- data.frame( list( gender=c( "M","M", "F", "M", "F", "F" ),
+ age=c( 47, 59, 21, 32, 33, 24 ),
+ income=c( 55000, 88000, 32450, 76500, 123000, 45650 ) ) )
> d$over25 <- ifelse( d$age > 25, 1, 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
注:Split()的输出是一个列表。