本节介绍*apply家族的另外两个函数:vapply,tapply. 类比于sapplylapply的升级版,vapplysapply的升级版。

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,在后面加一个我们期望的数据类型,这样如果返回的结果如果不是我们期望的,就会报错。

所以vapplysapply更安全,此外,在大数据集上表现更快。

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-datato-be-splited-data应用function

results matching ""

    No results matching ""