本教程旨在介紹apply()函數集合。apply()函數是所有集合中最基本的。我們還將學習sapply(),lapply()和tapply()。apply集合可以看作是循環的替代品。
如果將R與Anaconda一起安裝,則apply()集合與R基本軟件包捆綁在一起。apply()函數可以提供許多函數,以對對象(數據框,列表,向量等)的集合執行冗余應用程序。apply()的目的主要是為了避免顯式使用循環結構。它們可用于輸入列表,矩陣或數組并應用函數。任何函數都可以傳遞到apply()中。
在本教程中,您將學習:
- apply()函數
- lapply()函數
- sapply()函數
- 切片矢量
- tapply()函數
apply()函數
apply()將數據框或矩陣作為輸入,并以矢量,列表或數組形式輸出。apply()函數主要用于避免重復使用循環結構。它是所有可以在矩陣上使用的最基本的集合。
此函數接受3個參數:
apply(X, MARGIN, FUN)
-x:數組或矩陣
-MARGIN:取一個介于1到2之間的值或范圍,以定義該函數的應用位置:
-MARGIN = 1`:對行執行操作
-MARGIN = 2`:對列執行操作
-MARGIN = c(1,2)`該操作在行和列上執行
-FUN:告訴應用哪個功能。可以應用平均值,中位數,和,最小值,最大值甚至用戶定義的函數等內置函數
最簡單的示例是對所有列求和。代碼apply(m1,2,sum)將sum函數應用于矩陣5x6,并返回數據集中可訪問的每一列的總和。
m1 <- matrix(C<-(1:10),nrow=5, ncol=6)
m1
a_m1 <- apply(m1, 2, sum)
a_m1
輸出:
最佳實踐:在將值打印到控制臺之前,先存儲它們。
lapply()函數
lapply()函數可用于對列表對象執行操作,并返回與原始集合長度相同的列表對象。lappy()返回一個長度與輸入列表對象相似的列表,其每個元素都是將FUN應用于列表的相應元素的結果。lapply()將列表,向量或數據框作為輸入,并在列表中給出輸出。
lapply(X, FUN)
Arguments:
-X: A vector or an object
-FUN: Function applied to each element of x
lapply()中的l代表列表。lapply()和apply()之間的區別在于輸出返回之間。lapply()的輸出是一個列表。lapply()可以用于其他對象,例如數據框和列表。
lapply()函數不需要MARGIN。
一個非常簡單的示例是使用tolower函數將矩陣的字符串值更改為小寫。我們用著名電影的名稱構造一個矩陣。名稱為大寫形式。
movies <- c("SPYDERMAN","BATMAN","VERTIGO","CHINATOWN")
movies_lower <-lapply(movies, tolower)
str(movies_lower)
輸出:
## List of 4
## $:chr"spyderman"
## $:chr"batman"
## $:chr"vertigo"
## $:chr"chinatown"
我們可以使用unlist()將列表轉換為向量。
films_lower <- unlist(lapply(movies,tolower))
str(movies_lower)
輸出:
## chr [1:4] "spyderman" "batman" "vertigo" "chinatown"
sapply()函數
sapply()函數將列表,向量或數據幀作為輸入,并以向量或矩陣形式輸出。它對列表對象的操作很有用,并返回與原始集合長度相同的列表對象。sapply()函數執行的功能與lapply()函數相同,但返回一個向量。
sapply(X, FUN)
Arguments:
-X: A vector or an object
-FUN: Function applied to each element of x
我們可以從汽車數據集中測量汽車的最小速度和停車距離。
dt <- cars
lmn_cars <- lapply(dt, min)
smn_cars <- sapply(dt, min)
lmn_cars
smn_cars
輸出:
## $speed
## [1] 4
## $ dist
## [1] 2
## speed dist
## 4 2
我們可以在lapply()或sapply()中使用用戶內置函數。我們創建一個名為avg的函數來計算向量最小值和最大值的平均值。
avg <- function(x) {
( min(x) + max(x) ) / 2}
fcars <- sapply(dt, avg)
fcars
輸出量
## speed dist
## 14.5 61.0
sapply()函數在返回的輸出中比lapply()更有效,因為sapply()將值直接存儲到向量中。在下一個示例中,我們將看到情況并非總是如此。
下表總結了apply(),sapply()和lapply()之間的區別:
Function | Arguments | Objective | Input | Output |
---|---|---|---|---|
apply | apply(x, MARGIN, FUN) | Apply a function to the rows or columns or both | Data frame or matrix | vector, list, array |
lapply | lapply(X, FUN) | Apply a function to all the elements of the input | List, vector or data frame | list |
sapply | sappy(X FUN) | Apply a function to all the elements of the input | List, vector or data frame | vector or matrix |
切片矢量
我們可以使用lapply()或sapply()互換來切片數據框。我們創建一個函數below_average(),該函數接受數值的向量,并返回僅包含嚴格高于平均值的值的向量。我們將兩個結果與 identical() 函數進行比較。
below_ave <- function(x) {
ave <- mean(x)
return(x[x > ave])
}
dt_s <- sapply(dt, below_ave)
dt_l <- lapply(dt, below_ave)
identical(dt_s, dt_l)
輸出:
## [1] TRUE
tapply()函數
tapply()計算向量中每個因子變量的度量(均值,中位數,最小值,最大值等)或函數。這是一項非常有用的功能,可讓您創建向量的子集,然后將某些功能應用于每個子集。
tapply(X, INDEX, FUN = NULL)
Arguments:
-X: An object, usually a vector
-INDEX: A list containing factor
-FUN: Function applied to each element of x
數據科學家或研究人員的部分工作是計算變量匯總。例如,根據特征測量平均值或組數據。大多數數據按ID,城市,國家/地區等分組。總結小組會發現更多有趣的模式。
為了了解其工作原理,讓我們使用虹膜數據集。該數據集在機器學習領域非常有名。該數據集的目的是預測三種花類中的每一種的類別:萼片,雜色和維珍妮卡。數據集收集每個物種的長度和寬度信息。
作為先前的工作,我們可以計算每個物種的長度的中位數。tapply()是執行此計算的快速方法。
data(iris)
tapply(iris$Sepal.Width, iris$Species, median)
輸出:
## setosa versicolor virginica
## 3.4 2.8 3.0