本节介绍*apply
家族的另外两个函数:vapply
,tapply
.
类比于sapply
是lapply
的升级版,vapply
是sapply
的升级版。
vapply
函数
在用sapply
的时候,有时候返回的结果并不是我们预料之中那样优化过的,但是如果我们没有把它print出来,就不知道它是错的,但是vapply
可以帮助我们修正,如果不是我们期望输出的类型,就会报错。
> vapply(flags, unique)
...
$text
[1] 0 1
$topleft
[1] black red green blue white orange gold
Levels: black blue gold green orange red white
$botright
[1] green red white black blue gold orange brown
Levels: black blue brown gold green orange red white
> vapply(flags, unique, numeric(1))
Error in vapply(flags, unique, numeric(1)) : values must be length 1,
but FUN(X[[1]]) result is length 194
比如我们期望是一个输出长度为1的向量,但是如果vapply(flags, unique)
返回的结果只是作为中间值,被下一步调用,那就可能会出错,因为实际上输出的是一个list,list的每个属性的长度不一致。
所以我们用vapply
,在后面加一个我们期望的数据类型,这样如果返回的结果如果不是我们期望的,就会报错。
所以vapply
比sapply
更安全,此外,在大数据集上表现更快。
tapply
函数
他的作用是:
tapply()
to split your data into groups based on the value of some variable, then apply a function | to each group.
例子如下:
> unique(flags$landmass)
[1] 5 3 4 6 1 2
> table(flags$landmass) #landmass 属性有6种取值。每种属性下,有多少国家数量
1 2 3 4 5 6
31 17 35 52 39 20
> tapply( flags$population, flags$landmass, summary) # 根据landmass的取值,来对population进行summary操作
$`1`
Min. 1st Qu. Median Mean 3rd Qu. Max.
0.00 0.00 0.00 12.29 4.50 231.00
$`2`
Min. 1st Qu. Median Mean 3rd Qu. Max.
0.00 1.00 6.00 15.71 15.00 119.00
$`3`
Min. 1st Qu. Median Mean 3rd Qu. Max.
0.00 0.00 8.00 13.86 16.00 61.00
$`4`
Min. 1st Qu. Median Mean 3rd Qu. Max.
0.000 1.000 5.000 8.788 9.750 56.000
$`5`
Min. 1st Qu. Median Mean 3rd Qu. Max.
0.00 2.00 10.00 69.18 39.00 1008.00
$`6`
Min. 1st Qu. Median Mean 3rd Qu. Max.
0.00 0.00 0.00 11.30 1.25 157.00
> tapply(flags$animate, flags$landmass, mean) # 根据landmass的取值,来对对应的animate属性求均值
1 2 3 4 5 6
0.4193548 0.1764706 0.1142857 0.1346154 0.1538462 0.3000000
tapply(to-be-splited-data, based-on-data, function)
根据based-on-data
对to-be-splited-data
应用function
。