深入剖析lapply函數

一、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

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-02 14:39
下一篇 2024-12-02 14:39

相關推薦

  • Python中引入上一級目錄中函數

    Python中經常需要調用其他文件夾中的模塊或函數,其中一個常見的操作是引入上一級目錄中的函數。在此,我們將從多個角度詳細解釋如何在Python中引入上一級目錄的函數。 一、加入環…

    編程 2025-04-29
  • Python中capitalize函數的使用

    在Python的字元串操作中,capitalize函數常常被用到,這個函數可以使字元串中的第一個單詞首字母大寫,其餘字母小寫。在本文中,我們將從以下幾個方面對capitalize函…

    編程 2025-04-29
  • Python中set函數的作用

    Python中set函數是一個有用的數據類型,可以被用於許多編程場景中。在這篇文章中,我們將學習Python中set函數的多個方面,從而深入了解這個函數在Python中的用途。 一…

    編程 2025-04-29
  • 單片機列印函數

    單片機列印是指通過串口或並口將一些數據列印到終端設備上。在單片機應用中,列印非常重要。正確的列印數據可以讓我們知道單片機運行的狀態,方便我們進行調試;錯誤的列印數據可以幫助我們快速…

    編程 2025-04-29
  • 三角函數用英語怎麼說

    三角函數,即三角比函數,是指在一個銳角三角形中某一角的對邊、鄰邊之比。在數學中,三角函數包括正弦、餘弦、正切等,它們在數學、物理、工程和計算機等領域都得到了廣泛的應用。 一、正弦函…

    編程 2025-04-29
  • Python3定義函數參數類型

    Python是一門動態類型語言,不需要在定義變數時顯示的指定變數類型,但是Python3中提供了函數參數類型的聲明功能,在函數定義時明確定義參數類型。在函數的形參後面加上冒號(:)…

    編程 2025-04-29
  • Python定義函數判斷奇偶數

    本文將從多個方面詳細闡述Python定義函數判斷奇偶數的方法,並提供完整的代碼示例。 一、初步了解Python函數 在介紹Python如何定義函數判斷奇偶數之前,我們先來了解一下P…

    編程 2025-04-29
  • Python實現計算階乘的函數

    本文將介紹如何使用Python定義函數fact(n),計算n的階乘。 一、什麼是階乘 階乘指從1乘到指定數之間所有整數的乘積。如:5! = 5 * 4 * 3 * 2 * 1 = …

    編程 2025-04-29
  • 分段函數Python

    本文將從以下幾個方面詳細闡述Python中的分段函數,包括函數基本定義、調用示例、圖像繪製、函數優化和應用實例。 一、函數基本定義 分段函數又稱為條件函數,指一條直線段或曲線段,由…

    編程 2025-04-29
  • Python函數名稱相同參數不同:多態

    Python是一門面向對象的編程語言,它強烈支持多態性 一、什麼是多態多態是面向對象三大特性中的一種,它指的是:相同的函數名稱可以有不同的實現方式。也就是說,不同的對象調用同名方法…

    編程 2025-04-29

發表回復

登錄後才能評論