一、lapply的定義
lapply是R語言中的一個常用函數,其全稱為「list apply」,即對於一個列表型對象的每一元素應用一個特定的函數,返回一個由這些函數的返回值組成的列表對象。同時,lapply也支持其他的對象類型,如向量和數據框。
其基本語法如下:
lapply(X, FUN, …)
X表示列表型對象,FUN表示需要應用的函數,…代表FUN所需要的參數
二、lapply的使用
使用lapply時,需要先有一個列表型對象,下面我們通過示例代碼來說明:
#創建列表型對象
my_list <- list(1:5, letters[1:10])
#定義函數
my_fun <- function(x) {
paste(x, "hello", sep = ", ")
}
#通過lapply對my_list中每個元素應用my_fun函數
lapply(my_list, my_fun)
運行結果如下:
[[1]]
[1] "1 hello, 2 hello, 3 hello, 4 hello, 5 hello"
[[2]]
[1] "a hello, b hello, c hello, d hello, e hello, f hello, g hello, h hello, i hello, j hello"
可以看到,lapply返回了一個列表對象,其中每個元素都是由my_fun函數返回的結果。這個結果和my_list對象的結構一樣,是一個由兩個元素組成的列表。
三、lapply的特點
1、自動化迭代
lapply是一個高度封裝的函數,它對於迭代的過程進行了自動化處理,用戶只需要提供一個列表對象和一個需要應用的函數,就可以輕鬆地將這個函數應用到列表的每個元素上。
例如下面的代碼:
#創建數字型向量和字元型向量
my_num <- 1:10
my_char <- letters[1:10]
#定義平方函數和轉換為大寫字母的函數
my_square <- function(x) {
x^2
}
my_upper <- function(x) {
toupper(x)
}
#通過lapply對my_num和my_char中的每個元素應用函數
lapply(my_num, my_square)
lapply(my_char, my_upper)
運行結果如下:
[[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
[[1]]
[1] "A"
[[2]]
[1] "B"
[[3]]
[1] "C"
[[4]]
[1] "D"
[[5]]
[1] "E"
[[6]]
[1] "F"
[[7]]
[1] "G"
[[8]]
[1] "H"
[[9]]
[1] "I"
[[10]]
[1] "J"
可以看到,lapply自動對列表的每個元素進行了迭代,並將函數應用到每個元素上,返回了一個新的列表。此時每個元素都已經被處理完畢了。
2、結果是一個列表對象
lapply的返回結果是一個由函數處理結果組成的列表對象。這個列表對象的長度等於X的長度,每個元素是一個獨立的處理結果。
例如下面的代碼:
#創建一個數據框
my_df <- data.frame(name = c("Jack", "Peter", "Mary"),
age = c(26, 30, 24),
gender = c("M", "M", "F"))
#定義函數
my_fun <- function(x) {
paste("Name:", x$name, "Age:", x$age, "Gender:", x$gender, sep = " ")
}
#通過lapply對my_df每行應用my_fun函數
lapply(1:nrow(my_df), function(x) {
my_fun(my_df[x, ])
})
運行結果如下:
[[1]]
[1] "Name:Jack Age:26 Gender:M"
[[2]]
[1] "Name:Peter Age:30 Gender:M"
[[3]]
[1] "Name:Mary Age:24 Gender:F"
可以看到,lapply返回了一個列表對象,其中每個元素都是由my_fun函數在my_df數據框的每行都應用一次得到的結果。
四、lapply與其他apply函數的比較
1、apply
apply函數是R語言中非常經典的函數之一,它可以應用到任何數組型對象中,包括向量、矩陣和數據框等。而lapply只能應用到列表、向量和數據框等具有特定結構的對象中。
#創建矩陣型對象
my_mat <- matrix(1:12, nrow = 3)
#通過apply函數對矩陣中每行的元素進行求和
apply(my_mat, 1, sum)
#通過lapply函數對my_list中的每個元素應用sum函數
lapply(my_list, sum)
可以看到,通過apply函數可以對矩陣的每行應用sum函數得到其和,通過lapply函數只能對向量中的元素、列表中的元素、數據框中的列應用函數得到特定的結果。
2、sapply、vapply和mapply
sapply、vapply和mapply都是lapply的改進版本,具有更好的靈活性和更方便的使用方式。
sapply:
sapply基於lapply,並且自動處理返回結果的轉換。它會根據返回結果的類型,自動把返回結果轉換為簡單的類型(向量、矩陣或列表),可以省去轉換的步驟。
#創建列表型對象
my_list <- list(1:5, letters[1:10])
#定義函數
my_fun <- function(x) {
paste(x, "hello", sep = ", ")
}
#通過sapply對my_list中每個元素應用my_fun函數
sapply(my_list, my_fun)
可以看到,sapply可以自動將返回結果轉換為簡單的類型,這裡轉換成了一個矩陣。
[,1] [,2]
[1,] "1 hello" "a hello"
[2,] "2 hello" "b hello"
[3,] "3 hello" "c hello"
[4,] "4 hello" "d hello"
[5,] "5 hello" "e hello"
[6,] NA "f hello"
[7,] NA "g hello"
[8,] NA "h hello"
[9,] NA "i hello"
[10,] NA "j hello"
vapply:
vapply函數比sapply更為安全,因為它可以指定返回結果的類型和長度,避免返回結果出現不一致的情況。
mapply:
mapply函數適用於多列表模式下的應用,即在列表中應用多個具有相同結構的函數,或在多個列表中應用一個具有多參數的函數。
五、總結
lapply函數是R中一個非常常用且重要的函數。它為我們提供了一種高效、便捷的方式,對列表、向量和數據框等對象的每個元素應用相同的函數。在實際應用中,lapply可以幫助我們快速地進行數據處理和分析,提高工作效率。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/194496.html