一、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()函數可以為您節省大量時間和精力,提高代碼的可讀性和效率。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/194649.html