R語言中的apply(),lapply(),sapply(),tapply()函數以及示例

文章來源:R中的apply(),lapply(),sapply(),tapply()函數以及示例

本教程旨在介紹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

輸出:

img

最佳實踐:在將值打印到控制臺之前,先存儲它們。

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
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,001評論 6 537
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,786評論 3 423
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,986評論 0 381
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,204評論 1 315
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,964評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,354評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,410評論 3 444
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,554評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,106評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,918評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,093評論 1 371
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,648評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,342評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,755評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,009評論 1 289
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,839評論 3 395
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,107評論 2 375