您的位置:

r语言apply函数用法详解

一、apply函数的概述

apply函数是R语言中非常常用且强大的函数之一。它可以按行或列执行指定函数,并返回结果向量或矩阵。该函数可以用于数组、矩阵和数据框等对象,是一种通用的数据操作方式。apply()函数通常用于进行聚合分析,也可用于简化复杂的代码,提高代码的可读性。

set.seed(123)
matrix1 <- matrix(rnorm(20), ncol=5)
matrix1
#      [,1]  [,2]  [,3]   [,4]   [,5]
#[1,] -0.560 -0.230 1.558 0.0705 1.0705
#[2,] -0.230 1.558 0.070 0.1293 0.1293
#[3,]  1.556 0.0705 0.130 1.7151 0.6859
#[4,]  0.130 1.7151 1.715 0.4609 0.4609

 apply(matrix1, 2, mean)  # 2表示按列进行计算
# [1]  0.4986595  0.7787829  0.8682636  0.8414685  0.5869068

 apply(matrix1, 1, sum)  # 1表示按行进行计算
# [1] 2.866
# [2] 2.055
# [3] 4.127
# [4] 4.462

二、apply函数的参数解析

1. X

X参数表示待操作的对象,如矩阵、数组或数据框等。

set.seed(123)
matrix1 <- matrix(rnorm(20), ncol=5)
matrix1
#      [,1]  [,2]  [,3]   [,4]   [,5]
#[1,] -0.560 -0.230 1.558 0.0705 1.0705
#[2,] -0.230 1.558 0.070 0.1293 0.1293
#[3,]  1.556 0.0705 0.130 1.7151 0.6859
#[4,]  0.130 1.7151 1.715 0.4609 0.4609

apply(matrix1, 2, sum)  # 将每列的元素相加
# [1] 0.896 3.113 3.472 3.366 2.343

2. MARGIN

MARGIN表示函数操作的维度,是一个整数向量。1表示按行操作,2表示按列操作。默认值为1。

set.seed(123)
matrix1 <- matrix(rnorm(20), ncol=5)
matrix1
#      [,1]  [,2]  [,3]   [,4]   [,5]
#[1,] -0.560 -0.230 1.558 0.0705 1.0705
#[2,] -0.230 1.558 0.070 0.1293 0.1293
#[3,]  1.556 0.0705 0.130 1.7151 0.6859
#[4,]  0.130 1.7151 1.715 0.4609 0.4609

apply(matrix1, 1, sum)  # 按行相加
# [1] 2.866
# [2] 2.055
# [3] 4.127
# [4] 4.462

apply(matrix1, 2, sum) # 按列相加
# [1] 0.896 3.113 3.472 3.366 2.343

3. FUN

FUN表示应用到数据的函数。可以是内置函数或自定义函数。

set.seed(123)
matrix1 <- matrix(rnorm(20), ncol=5)
matrix1
#      [,1]  [,2]  [,3]   [,4]   [,5]
#[1,] -0.560 -0.230 1.558 0.0705 1.0705
#[2,] -0.230 1.558 0.070 0.1293 0.1293
#[3,]  1.556 0.0705 0.130 1.7151 0.6859
#[4,]  0.130 1.7151 1.715 0.4609 0.4609

apply(matrix1, 2, function(x) length(unique(x))) # 计算每列独特元素的数量
# [1] 4 4 4 4 4

4. ...

省略号可以传递额外的参数给FUN函数,使用时需要将FUN函数设置为可以接受省略号的参数。使用...参数可以动态的传递参数。

# 对x矩阵的每一列做二次项的和
x <- matrix(1:12, ncol=3)
apply(x, 2, function(x, a, b) sum(a * x^2 + b), a=1, b=2)
# [1]  38  83 146

三、apply函数的相关函数

1. sapply函数

sapply()函数可应用于向量、列表和矩阵等。在矩阵中,它返回的结果与apply函数相同。与apply不同的是,sapply返回的是一个向量。

set.seed(123)
matrix1 <- matrix(rnorm(20), ncol=5)
matrix1
#      [,1]  [,2]  [,3]   [,4]   [,5]
#[1,] -0.560 -0.230 1.558 0.0705 1.0705
#[2,] -0.230 1.558 0.070 0.1293 0.1293
#[3,]  1.556 0.0705 0.130 1.7151 0.6859
#[4,]  0.130 1.7151 1.715 0.4609 0.4609

sapply(matrix1, mean)
#[1]  0.4986595  0.7787829  0.8682636  0.8414685  0.5869068

2. lapply函数

lapply()函数可应用于列表、数据框和矩阵等。它返回的是一个列表。

set.seed(123)
matrix1 <- matrix(rnorm(20), ncol=5)
matrix1
#      [,1]  [,2]  [,3]   [,4]   [,5]
#[1,] -0.560 -0.230 1.558 0.0705 1.0705
#[2,] -0.230 1.558 0.070 0.1293 0.1293
#[3,]  1.556 0.0705 0.130 1.7151 0.6859
#[4,]  0.130 1.7151 1.715 0.4609 0.4609
list_1 <- as.list(matrix1)

lapply(list_1, function(x) mean(x))
#[[1]] [1] -0.01877
#[[2]] [1] 0.5275837
#[[3]] [1] 0.8317141
#[[4]] [1] 0.8961867
#[[5]] [1] 0.5869068

3. tapply函数

tapply()函数可以对一个向量按指定的因子进行分类操作。它返回的结果是一个数组、矩阵或列表等。

set.seed(123)
age <- c(28, 20, 34, 22, 30, 31, 27, 26, 21, 25, 25, 32)
sex <- factor(c("M", "M", "F", "F", "M", "F", "F", "M", "M", "F", "M", "F"))
salary <- rnorm(12, mean = 2000, sd = 500)
df1 <- data.frame(age, sex, salary)

tapply(df1$salary, df1$sex, mean)
#   F        M 
#1969.675 2236.187 

四、apply函数的注意事项

1. 数据类型和形式必须正确

输入的数据类型和形式必须符合apply函数的要求。apply()函数不能用于字符型数据或数据框,必须用于向量、数组或矩阵等数据类型。

2. 函数必须是纯函数或返回标量值

如果应用的函数有任何可见副作用,则结果可能无法实现。因此,函数的输出应该是标量值,即单个数字或字符、向量、矩阵或数组。

3. 谨防NA值

apply()函数对于NA值的处理有时可能会使结果出现问题。因此使用该函数时,应注意避免NA值,或使用适当的函数来处理它们。

总结

apply函数是R语言中非常强大、常用的函数之一。通过提供各种选项和参数,可以定制函数操作到各种数据类型。这样,在进行数据操作时,R语言中的apply()函数可以为您节省大量时间和精力,提高代码的可读性和效率。