Tổng hợp khái quát về các dùng các hàm họ apply trong R tùy vào nhiệm vụ cụ thể:

1. Hàm apply

Cú pháp của hàm là: apply(x, margin, …)* trong đó:

X <- matrix(rnorm(30), nrow = 10, ncol = 3)
X
##             [,1]        [,2]       [,3]
##  [1,]  0.2935359 -0.02898187  0.5578781
##  [2,] -0.5848134 -0.71110203  0.1073003
##  [3,] -1.1782105 -0.84082828  0.5805672
##  [4,] -1.3664944  2.22568675 -1.6201307
##  [5,]  0.5234945  0.61617921  1.8937651
##  [6,]  1.2898477 -1.07742143 -1.7066022
##  [7,] -0.9352789 -0.82525862 -0.6033519
##  [8,] -0.6138983  0.46669126 -0.3191703
##  [9,]  1.4033275  0.87647496 -1.4707871
## [10,] -0.2012221  1.17955895 -1.2257908

Tính trung bình các cột của ma trận này:

apply(X, 2, mean)
## [1] -0.1369712  0.1880999 -0.3806322

Tính mean cho dòng:

apply(X, 1, mean)
##  [1]  0.27414404 -0.39620505 -0.47949053 -0.25364612  1.01114625
##  [6] -0.49805865 -0.78796313 -0.15545913  0.26967176 -0.08248466

Hay là áp dụng cho một hàm tự tạo:

myfun <- function(x){
  return(sum(x)/mean(x))
}
apply(X, 2, myfun)
## [1] 10 10 10

Hay:

apply(X, 2, function(x) {sum(x)/mean(x)})
## [1] 10 10 10

2. Hàm lappply: Dùng dữ liệu đầu vào có thể là 1 list, dât frame hay vector, và kết quả trả về là một list

ví dụ 1:

data <- iris
lapply(data, mean)
## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA
## $Sepal.Length
## [1] 5.843333
## 
## $Sepal.Width
## [1] 3.057333
## 
## $Petal.Length
## [1] 3.758
## 
## $Petal.Width
## [1] 1.199333
## 
## $Species
## [1] NA

Ví dụ 2:

my_list <- list(iris, trees)
lapply(my_list, summary)
## [[1]]
##   Sepal.Length    Sepal.Width     Petal.Length    Petal.Width   
##  Min.   :4.300   Min.   :2.000   Min.   :1.000   Min.   :0.100  
##  1st Qu.:5.100   1st Qu.:2.800   1st Qu.:1.600   1st Qu.:0.300  
##  Median :5.800   Median :3.000   Median :4.350   Median :1.300  
##  Mean   :5.843   Mean   :3.057   Mean   :3.758   Mean   :1.199  
##  3rd Qu.:6.400   3rd Qu.:3.300   3rd Qu.:5.100   3rd Qu.:1.800  
##  Max.   :7.900   Max.   :4.400   Max.   :6.900   Max.   :2.500  
##        Species  
##  setosa    :50  
##  versicolor:50  
##  virginica :50  
##                 
##                 
##                 
## 
## [[2]]
##      Girth           Height       Volume     
##  Min.   : 8.30   Min.   :63   Min.   :10.20  
##  1st Qu.:11.05   1st Qu.:72   1st Qu.:19.40  
##  Median :12.90   Median :76   Median :24.20  
##  Mean   :13.25   Mean   :76   Mean   :30.17  
##  3rd Qu.:15.25   3rd Qu.:80   3rd Qu.:37.30  
##  Max.   :20.60   Max.   :87   Max.   :77.00

Ví dụ 3:

my_vec <- c(1:10)
lapply(my_vec, function(x) {x**2})
## [[1]]
## [1] 1
## 
## [[2]]
## [1] 4
## 
## [[3]]
## [1] 9
## 
## [[4]]
## [1] 16
## 
## [[5]]
## [1] 25
## 
## [[6]]
## [1] 36
## 
## [[7]]
## [1] 49
## 
## [[8]]
## [1] 64
## 
## [[9]]
## [1] 81
## 
## [[10]]
## [1] 100

3. Hàm sapply()

Lệnh này tương tự như lapply, chỉ có điều khác biệt ở cấu trúc trả về

my_vec <- c(1:10)
sapply(my_vec, function(x) {x**2})
##  [1]   1   4   9  16  25  36  49  64  81 100
data <- iris
sapply(data, mean)
## Warning in mean.default(X[[i]], ...): argument is not numeric or logical:
## returning NA
## Sepal.Length  Sepal.Width Petal.Length  Petal.Width      Species 
##     5.843333     3.057333     3.758000     1.199333           NA

4. Hàm tapply

Ví dụ: Nếu muốn tính mean cho Petal.Length ứng với các loài hoa của bộ dữ liệu iris:

# Tính  mean cho từng loài hoa: 
tapply(iris$Sepal.Length, iris$Species, mean)
##     setosa versicolor  virginica 
##      5.006      5.936      6.588
class(tapply(iris$Sepal.Length, iris$Species, mean))
## [1] "array"