向量是R的基本运算对象,在通常的数据处理中,向量化计算可以大大提高运算效率。在R中,apply系列函数提供了最主要的向量化运算,这里总结一下apply系列函数的学习记录。
apply()
函数
常用调用
|
|
apply()
函数主要作用于数组和矩阵,如果X
是数据框,apply()
会通过as.matrix()
或者as. array()
将其转为矩阵。如果所有行列不是数值型或者类型不一致,导致转换失败,那么apply是运算不出任何一列的结果,因此不建议对数据框使用。
MARGIN
参数为1时,作用对象是行,为2时作用对象是列,c(1, 2)
指作用对象为行列。可以指定函数的参数
使用
在进行行列的合计或者平均等统计量计算时,用apply()
是很有效率的。例如:
|
|
在对向量进行分组计算是,apply()
也是非常容易实现的,例如我们可以把向量临时分为行列,然后对其使用apply()
函数。
|
|
当然,在进行简单的行列统计量计算时,也可以直接使用rowSums()
, colSums()
, rowSums()
, rowMeans()
, colMeans()
函数。
lapply()
和sapply()
函数
lapply()
函数读入一个列表,将函数应用到列表的每一个元素,然后返回一个与原来相同长度的列表。
sapply()
函数将lapply()
函数的结果做了简单化处理,通常,如果结果是一个列表,其中每个元素的长度都是1,那么sapply()
将返回一个向量。如果结果是一个列表,其中每个元素都是相同长度的向量(大于1),那么sapply()
将返回一个矩阵。如果sapply()
不能解决问题,那么它只返回一个列表,与lapply()
会给出的结果没有什么不同。
常用调用
调用方法 lapply()
和sapply()
是相同的。
|
|
使用
首先对数据使用lapply()
函数,查看结果。
|
|
我们可以看到,返回结果是一个长度为8的列表,每个元素对应数据集的一列。如果要简化输出效果,我们可以使用as.character(cls_list)
,使其转化为一个字符型向量,但是使用sapple()
函数可以简单完成这种目的。
|
|
当每个元素都是相同长度的向量(大于1)时,则返回一个矩阵。
|
|
当返回结果长度不同时,sapply()
函数只返回一个列表。
|
|
我们再对数据集使用lapply()
函数,通过调用identical()
可以看出,当返回结果长度不同时sapply()
函数与lapply()
函数返回结果相同。
|
|
vapply()
和tapply()
函数
vapply类似于sapply,但是有一个预先指定的返回值类型,因此它可以更安全,针对大量数据集时也可能更快。tapply()
函数可以实现对一些变量分组应用指定函数。
常用调用
|
|
使用
先看sapply()
的最后一个例子,返回结果长度不同时会以列表形式呈现。当我们使用vapply()
预先指定返回类型时,就会提示错误信息。
|
|
但是大部分情况下sapply()
都能够有很好的表现,还能减少输入量。
其次是tapply()
,这里调用airquality
数据集来计算按月分组的平均风速
|
|
mapply()
函数
函数mapply()
是函数sapply()
的变形版,mapply()
将函数FUN
依次应用每一个参数的第一个元素、第二个元素、第三个元素上。
常用调用
|
|
使用
再返回结果长度相同时,sapply()
和mapply()
结果是一样的,例如我们对airquality
数据前三列求均值。
|
|
但是在返回结果长度不同时,sapply()
就会返回错误提示。
我们把rep
参数设置为2时,会返回一个矩阵。
|
|
但是mapply()
函数可以把rep
依次应用到每个参数的每个元素。
|
|