apply函数可以看作是循环的替代方法,在R语言中,apply函数的变体有很多,好多时候同学搞不清到底该用apply呢,还是tapply呢还是sapply呢。今天就给大家系统地写一写。

The apply() function can be feed with many functions to perform redundant application on a collection of object (data frame, list, vector, etc.). The purpose of apply() is primarily to avoid explicit uses of loop constructs.

apply函数的重要作用就是把一个函数给一群数据应用上,这个一群数据可以是data frame, list, vector等等,有什么好处呢?它可以大大地提高代码的整洁性和灵活性。

本文章会给大家详细介绍以下函数:

  • apply() function
  • lapply( )function
  • sapply() function
  • tapply() function

apply() 函数

apply() takes Data frame or matrix as an input and gives output in vector, list or array.

apply需要的输入是一个矩阵或者数据框,但是输出却不是这两个类型,这个是需要注意的,一般而言,apply的用法如下:

apply(X, MARGIN, FUN)

上面的形式中X代表我们输入的数据框或者矩阵,MARGIN为应用函数的方向,可以取1或者2,1代表行,2代表列,FUN就是你要应用的函数。

看例子:

m1 <- matrix(C<-(1:10),nrow=5, ncol=6)
m1
a_m1 <- apply(m1, 2, sum)
a_m1

以上的代码就是生成了一个矩阵,然后按列进行求和,看输出:

R语言中 acf R语言中sapply函数_数据分析

 

lapply() 函数

lapply可以接受的输入类型为list, vector or data frame, 但是其输出是列表,而且是把函数应用到对象的每一个元素,这个与apply不同:

lapply() function is useful for performing operations on list objects and returns a list object of same length of original set.

lapply中的l代表list,lapply的基本用法如下:

lapply(X, FUN)

其中X为输入的数据,FUN为你想应用到数据中每个元素的函数。因为lapply是应用到每一个元素上的,所以就不需要MARGIN这个参数了嘛。

看例子:

movies <- c("SPYDERMAN","BATMAN","VERTIGO","CHINATOWN")
movies_lower <-lapply(movies, tolower)
str(movies_lower)

上面的代码中,我想把所有的大写单词改写成小写单词,我就给所有元素应用tolower就好啦。看输出:

R语言中 acf R语言中sapply函数_Data_02

 

此时就全部为小写单词了。

sapply() 函数

sapply() function takes list, vector or data frame as input and gives output in vector or matrix. It is useful for operations on list objects and returns a list object of same length of original set. sapply() function does the same job as lapply() function but returns a vector.

sapply和lapply的做的事情是一样的,但是sapply输出的是向量,lapply输出的是list,这个就是最大的差别。

sapply的一般的用法如下,和lapply一模一样,这儿就不多给大家解释了:

sapply(X, FUN)

直接看例子:

dt <- cars
lmn_cars <- lapply(dt, min)
smn_cars <- sapply(dt, min)
lmn_cars

上面的代码中,我把cars这个数据集分别用了lapply和sapply,都是求最小值,看结果:

R语言中 acf R语言中sapply函数_R语言中 acf_03

 

看见没,一个输出是list另一个是向量。就这点区别。

tapply() 函数

tapply() computes a measure (mean, median, min, max, etc..) or a function for each factor variable in a vector. It is a very useful function that lets you create a subset of a vector and then apply some functions to each of the subset.

tapply 和上面的三个就有点不同了,tapply可以将函数用于一个向量中的子集。就是说,先造子集再给子集运用你想运用的函数。非常适合分组统计。

tapply的一般用法为:

tapply(X, INDEX, FUN = NULL)

其中X为你的数据,INDEX为你想要的子集的索引,FUN为你想运用的函数。

还是给大家写一个例子:

我想给鸢尾花数据集分类别求其的花瓣宽度的中位数,我就可以写出如下的代码:

data(iris)
tapply(iris$Sepal.Width, iris$Species, median)

R语言中 acf R语言中sapply函数_R语言中 acf_04

 

上面的代码意思就是我要给iris$Sepal.Width运用tapply,分组以iris$Species进行,分好组后对每个组运用median函数。