R 各类循环简介(二)

今天我们介绍下速度比较快的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)
结果

你可能感兴趣的:(R 各类循环简介(二))