一、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()函数可以为您节省大量时间和精力,提高代码的可读性和效率。