0%

R语言中的各种apply函数

用R语言在写函数的时候,会经常用到apply函数,从而避免在R中使用循环,R语言中的apply函数主要有apply()、tapply()、lapply()、tapply()。各种apply函数很容易搞混淆,因此在这里记录一下。

1. apply()函数

apply(X,MARGIN,FUN),输入为dataframe或matrix,以矢量、列表、数组形式输出,参数解释:

  • X:dataframe或matrix
  • MARGIN:dataframe/matrix的行或列,
    • MARGIN=1:对行进行操作
    • MARGIN=2:对列执行操作
  • FUN:对数据框、矩阵执行的操作

例如:

1
2
3
4
5
6
7
8
9
10
11
12
13
> m1 <- matrix((1:10),nrow=4, ncol=5,byrow=F)
> m1
[,1] [,2] [,3] [,4] [,5]
[1,] 1 5 9 3 7
[2,] 2 6 10 4 8
[3,] 3 7 1 5 9
[4,] 4 8 2 6 10
# 对行进行操作,计算每行的和
> apply(m1,1,sum)
[1] 25 30 25 30
# 对列进行操作,计算每列的和
> apply(m1,2,sum)
[1] 10 26 22 18 34

2. lapply()函数

lapply(X,FUN),输入为list、vector或data.frame,并返回与原始集合长度相同的列表list,lapply不需要MARGIN。

  • X:向量vector或者object
  • FUN:对X的每个元素执行的操作
1
2
3
4
5
6
7
8
> m2 <- c("A","B","C","D")
> m2_lower <-lapply(m2, tolower)
> str(m2_lower)
## List of 4
## $:chr"a"
## $:chr"b"
## $:chr"c"
## $:chr"d"

我们可以使用unlist()将列表转换为向量。

1
2
3
> m2_lower2 <- unlist(lapply(m2,tolower))
> str(m2_lower2)
## chr [1:4] "a" "b" "c" "d"

3.sapply()函数

sapply()函数将列表、向量、数据框等作为输入,以向量或矩阵的形式输出。
sapply(X,FUN)

  • X:vector or object
  • FUN:执行的操作函数
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
> m3 <- cars
> head(m3)
speed dist
1 4 2
2 4 10
3 7 4
4 7 22
5 8 16
6 9 10
> m3_lmin <- lapply(m3,min)
> m3_smin <- sapply(m3,min)
> m3_lmin
$speed
[1] 4

$dist
[1] 2

> m3_smin
speed dist
4 2

sapply()函数执行的功能与lapply()函数相同,sapply()函数返回一个向量,lapply()函数返回一个向量。

apply()、sapply()、lapply()之间的区别:

Function Arguments Objective Input Output
apply apply(x, MARGIN, FUN) Apply a function to the rows or columns or both Data.frame or matrix vector, list, array
lapply lapply(X, FUN) Apply a function to all the elements of the input List, vector or data.frame list
sapply sappy(X FUN) Apply a function to all the elements of the input List, vector or data.frame vector or matrix

4.tapply()函数

tapply()计算向量中每个因子变量的度量(均值、中位数、最小值、最大值等)或函数,即对数据分组进行运算。也可以创建向量的子集,然后将FUN函数应用于每个子集。
tapply(X,INDEX,FUN=NULL,simplify=TRUE)

  • X:object,通常是vector
  • INDEX:一个list对象,且该list中的每一个元素都是与X有同样长度的因子
  • FUN:是需要计算的函数
  • simplify是逻辑变量,若取值为TRUE(默认值),且函数FUN的计算结果总是为一个标量值,那么函数tapply返回一个数组;若取值为FALSE,则函数tapply的返回值为一个list对象。
1
2
3
4
5
6
7
8
9
10
11
12
13
> iris
Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1 5.1 3.5 1.4 0.2 setosa
2 4.9 3.0 1.4 0.2 setosa
......
51 7.0 3.2 4.7 1.4 versicolor
52 6.4 3.2 4.5 1.5 versicolor
......
149 6.2 3.4 5.4 2.3 virginica
150 5.9 3.0 5.1 1.8 virginica
> tapply(iris$Sepal.Length,iris$Species,median)
setosa versicolor virginica
5.0 5.9 6.5

tapply()函数的INDEX也可以是多列的组合,例如:

1
2
3
4
5
6
7
> newiris$Sepal.Length_compare_with_5<-ifelse(newiris$Sepal.Length>5.0,"over_than_5","lower_than_5")
> tapply(newiris$Sepal.Width,newiris[,c("Species","Sepal.Length_compare_with_5")],mean)
Sepal.Length_compare_with_5
Species lower_than_5 over_than_5
setosa 3.213793 3.723810
versicolor 2.233333 2.804255
virginica 2.500000 2.983673

参考资料:
1.https://zhuanlan.zhihu.com/p/26029242 这个里面有更多关于apply函数的详细解释,非常有帮助!