这篇文章主要介绍R语言中处理循环,排序,总结重要信息的常用函数。
处理循环的函数
lapply函数
这个函数就是俗称的一句话循环函数,不同于while循环或者for循环,这个函数可以实现一句话就是一个循环的效果。
具体格式为lapply(列表名,函数,其它参数),其中列表名告诉lapply我们要处理的对象,如果传的不是列表而是向量等数据结构类型,lapply会自动转换成列表结构。第二个参数:函数告诉lapply要对列表进行怎样的操作。lapply的返回值是一个列表。
举个例子,创建一个名为x的列表
x包含两个元素,他们均为向量。接着使用lapply函数对x进行求平均值的操作(求平均值的函数是mean),结果如图
发现确实是求出了a元素和b元素的平均值
再来看一个例子,假如有一个向量x
runif的功能是从一个均匀分布的总体里抽取若干个数出来,默认是从0到100进行抽取。在上一个代码的基础上再加两个参数,表示从0到100中进行抽取。结果如图
借助lapply函数,我们只用一行代码就对列表x的每一个元素都进行了函数runif的处理。
lapply参数中的函数,还可以是我们自定义的函数,比如有这样的一个列表x
列表x包含两个元素,这两个元素均为矩阵,然后执行这句代码
我们发现此时lapply函数的对象是x,对x中每个元素要进行的操作由后面的函数决定,function(m)代表这是一个自定义函数,m类似于C语言中的形参,后面的m[1,]就是这个函数的功能,也就是C语言中的函数体,m[1,]表示提取m的第一行。在运行的时候lapply函数会用x列表的每一个元素依次替代掉m,因此这句代码的意思就是对列表x的每个元素(这里是x的元素是矩阵)进行提取第一行的操作,运行结果也的确如此。返回的是一个列表,第一个元素是一个向量,也就是x列表第一个元素的第一行,第二个元素也是一个向量,表示x列表第二个元素的第一行。
apply函数
apply用于沿着数组的某一维度处理数据,比如沿着矩阵的行或列进行处理。
函数原型为apply(数组,维度,函数/函数名)
举个例子
首先创建了一个简单的矩阵,然后对矩阵x的按列求平均值,其中第二个参数写2代表按照列进行处理。当然apply函数的功能远远不止于此,实际上对于矩阵x每列的和,平均值等等可以使用rowSums(x),rowMeans(x)这样的函数来更高效的实现。
quantile函数用于求百分位点,后面的probs参数表示要求的是0.25和0.75位点。
再来看一个更加复杂的例子
有一个三维的数组,第三个维度的第一个元素是一个两行三列的矩阵,第二,三,四个元素也是。对于这样一个三维的数据,怎么用apply函数呢?比如有这样一个代码与运行结果
我们知道apply的第二个参数代表维度,那为什么上面这个维度还成个向量了呢?难不成是又对第一个维度求平均值,又对第二个维度求平均值吗?从结果来看显然不是,因为如果是像上面说的那样对两个维度分别求平均值,结果应该是两个向量,就好像在空间直角坐标系当中对一些散点的横坐标和纵坐标分别求平均值一样,但是这里返回的结果是一个矩阵,因此实际上这样维度这个参数传c(1,2)的时候是在对几个矩阵求平均值,对哪几个矩阵求平均值呢?我们说三维数组在展示的时候都是站在第三个维度的视角来展示的,创建数组的时候第三个维度的数值是几,就展示几个矩阵,这里在创建数组x的时候第三个维度的数字是4,那就展示四个矩阵,而apply求得也是这四个矩阵的平均值。
或者说这样理解,传的维度是c(1,2),那就是要求这样一个维度的平均值,这代表二维的矩阵,那就是求这些矩阵的平均值。