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
apply(X, 2, mean)
## [1] -0.1369712 0.1880999 -0.3806322
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
myfun <- function(x){
return(sum(x)/mean(x))
}
apply(X, 2, myfun)
## [1] 10 10 10
apply(X, 2, function(x) {sum(x)/mean(x)})
## [1] 10 10 10
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
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
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
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
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"