今天我们介绍下速度比较快的apply()家族函数,它的运行速度有大神已经测试过,详情请看:https://www.jianshu.com/p/cac358ac3033
apply
在用任何函数之前我们都要了解下适用的数据类型,apply适用于dataframe,matrix等。
它为什么快呢?是因为apply是基于底层C语言的,所以性能更高
接下来我们以数据框为例:
数据类型
假设我要对行求和
aa = apply(datax,1,sum)
##1是对行做遍历
##2是对列做遍历
#自定义函数也可以
apply(datax,1,function(x){expression})
这样求出来的数据类型是numeric
lapply
这个算是个升级,lapply输出的结果是list,所以这种循环是基于元素进行遍历,因此不需要指定行或列遍历
lapply输入类型可以是一个vector或者一个对象,所以适用面比较大:
a = c(1,2,3)
b = c(2,3,4)
c = list(a,b)
lapply(c,sum)
c
lapply结果
有结果我看到,输入为list,那么遍历list里面的所有元素,进行求和,最后把结果输出成list
sapply
这个是一个简化版的lapply,与lapply的区别是输出结果的数据结构,可以将输出结果数组化,即可以输出为vectory
a = c(1,2,3)
b = c(2,3,4)
c = list(a,b)
sapply(c,sum,simplify = T)
##simplify = T为输出数组化
其中,simplify = T为输出数组化,simplify = F为输出为list
mapply
这是个升级版的sapply,可以输入多个变量
我们以数据框为例
数据类型
#对列遍历
mapply(sum, datax[1,],datax[2,],datax[3,])
#对行遍历
mapply(sum, datax[,1],datax[,2],datax[.3])
结果
该函数对行列遍历体现在访问的是行还是列
tapply
tapply()函数与group_by()函数 + summarize()函数的功能一样
进行分组统计:
data(iris)
tapply(iris$Sepal.Width, iris$Species, sum)
结果