R语言中vapply()和tapply()的用法

  本文通过实例说明R语言*apply()系列中vapply()和tapply()的用法,所用到的数据同R语言中lapply()和sapply()的用法。在http://archive.ics.uci.edu/ml/machine-learning-databases/flags/flag.data下载到flag.data文件,将其导入R:

 1. vapply()

  在R语言中lapply()和sapply()的用法中说明了sapply()的用法,sapply()会尝试对apply的结果进行简化,如果无法简化,则不进行简化,返回原始结果。与sapply()类似,vapply()也会对apply结果进行简化,vapply()的不同之处在于,它需要显式地指明所希望简化为的具体格式,如果无法简化为所指定的格式,则会给出Error。使用 cls_vect <- sapply(flags, class) 可以得到flags中各列的类型名称,并简化为一个character型的vector,使用vapply()并指明结果格式为 character(1) 可以得到相同的结果:

 而如果希望通过vapplu()得到 numeric(1) 的结果,会出现Error:

   通过显式指明所希望得到的格式,vapply()比sapply()更加“保险”,你总能通过vapply()得到希望的结果(或者Error)。此外,在大量数据下使用vapply()的效率要比sapply()高,因为vapply()不需要像sapply()那样去猜测如何对结果进行合适的简化。

2. tapply()

   tapply()允许根据某些变量的值,把原始数据分割为若干组,然后对每一组数据应用特定的操作。在flags数据中,landmass表示国家所在的洲(1=N.America, 2=S.America, 3=Europe, 4=Africa, 4=Asia, 6=Oceania ),animate为1时表示国旗中包含卡通动画形象(如鹰、树等),反之为0。查看landmass和animate各个取值所包含的数据条数如下:

如果想要知道在各个洲国家中,国旗上有卡通动画形象所占的比例,则可以使用:

这里 tapply(flags$animate, flags$landmass, mean) 表示将flags$animate的数据按照flags$landmass的值进行分组,然后对各组应用mean()计算均值。这里flags$landmass共可取1到6之间的六个整数值,根据flags$landmass的不同取值,flags$animate被分为6组。flags$animate取值为0或1,对其求均值,即为flags$animate中1(国旗上有卡通动画形象)所占的比例。

  类似地,可以这样根据国旗上是否有红色,来分别统计这两类国家的人口情况: