R語言apply家族函數的用法及其比較

2021-03-02 表哥有話講


         R是一個面向科學工程計算特別是統計計算的工具。與matlab一樣,其循環結構的效率也無法讓人滿意。在平常的編程過程中我們應該儘量避免使用循環,而採用向量化的編程語法可以幫助我們有效提高數據處理效率。本文我們主要介紹如何使用R語言中的apply家族函數來實現向量化運算。

案例中需要用到的數據集

為了更好的理解apply家族函數的用法,本文需要用到mtcars數據集和beavers數據集。

#mtcars數據集是從1974年 Motor Trend Us 雜誌採集到的,數據集的列由油耗以及汽車設計的10個方面共計11個變量組成,共有32條記錄。data("mtcars")head(mtcars)                   mpg cyl disp  hp drat    wt  qsec vs am gear carbMazda RX4         21.0   6  160 110 3.90 2.620 16.46  0  1    4    4Mazda RX4 Wag     21.0   6  160 110 3.90 2.875 17.02  0  1    4    4Datsun 710        22.8   4  108  93 3.85 2.320 18.61  1  1    4    1Hornet 4 Drive    21.4   6  258 110 3.08 3.215 19.44  1  0    3    1Hornet Sportabout 18.7   8  360 175 3.15 3.440 17.02  0  0    3    2Valiant           18.1   6  225 105 2.76 3.460 20.22  1  0    3    1# beavers數據是對海狸的體溫測量數據data(beavers)head(t(beaver1)[1:4,1:10])        [,1]   [,2]   [,3]   [,4]   [,5]   [,6]   [,7]   [,8]    [,9]   [,10]day   346.00 346.00 346.00 346.00 346.00 346.00 346.00 346.00  346.00  346.00time  840.00 850.00 900.00 910.00 920.00 930.00 940.00 950.00 1000.00 1010.00temp   36.33  36.34  36.35  36.42  36.55  36.69  36.71  36.75   36.81   36.88activ   0.00   0.00   0.00   0.00   0.00   0.00   0.00   0.00    0.00    0.00

apply()函數

apply()函數的調用格式為apply(X, MARGIN, FUN, ...),其中:

案例演示:

#按行計算最大值apply(t(beaver1),1,max)    day    time    temp   activ 347.00 2350.00   37.53    1.00 #按列計算均值apply(mtcars,2,mean)       mpg        cyl       disp         hp       drat         wt       qsec         vs         am       gear       carb 20.090625   6.187500 230.721875 146.687500   3.596563   3.217250  17.848750   0.437500   0.406250   3.687500   2.812500 #將數據集按列運用到自定義函數上head(apply(mtcars,2,function(x) x%%10))                  mpg cyl disp hp drat    wt qsec vs am gear carbMazda RX4         1.0   6    0  0 3.90 2.620 6.46  0  1    4    4Mazda RX4 Wag     1.0   6    0  0 3.90 2.875 7.02  0  1    4    4Datsun 710        2.8   4    8  3 3.85 2.320 8.61  1  1    4    1Hornet 4 Drive    1.4   6    8  0 3.08 3.215 9.44  1  0    3    1Hornet Sportabout 8.7   8    0  5 3.15 3.440 7.02  0  0    3    2Valiant           8.1   6    5  5 2.76 3.460 0.22  1  0    3    1

lapply()函數

lapply()函數的調用格式為lapply(X, FUN, ...),結果的返回是list類型,其組件長度跟X的組件長度相同。其中:

X:list對象

FUN:調用的函數

...:是FUN函數的可選參數

創建組件長度為2的列表l = list(a=1:10,b=11:20)  #對每個組件求均值lapply(l, mean)$a[1] 5.5$b[1] 15.5#查看返回結果的數據類型class(lapply(l, mean))[1] "list#對每個組件求和lapply(l, sum)$a[1] 55$b[1] 155

sapply()函數

sapply()函數是lapply()函數的一個更加友好版本,它實現了對lapply()函數的封裝。返回的結果是一個向量或矩陣

l = list(a=1:10,b=11:20)  # mean of values using sapply sapply(l, mean)   a    b 5.5 15.5

tapply()函數

tapply()函數的作用是先將數據分為若干組,然後在每組數據調用指定的函數。函數調用格式為tapply(X, INDEX, FUN = NULL, ..., simplify = TRUE),其中:

#查看數據結構str(mtcars$cyl) num [1:32] 6 6 4 6 8 6 8 4 4 6 ...levels(as.factor(mtcars$cyl))[1] "4" "6" "8"tapply(mtcars$mpg,mtcars$cyl,mean)       4        6        8 26.66364 19.74286 15.10000

mtcars數據集中的列cyl共有三種汽車氣缸類型,tapply()函數會自動將數值型向量其轉為因子類型,最後對每種汽缸數類型的汽車每加侖汽油行駛裡程數求平均值。

by()函數

如上所述,tapply()函數中的參數X只能是一個向量,而by()函數很好的實現了對tapply()函數的封裝,使得傳入的數據可以是數據框或矩陣。調用格式為by(data, INDICES, FUN, ..., simplify = TRUE)。其中:

data(iris) str(iris)'data.frame': 150 obs. of  5 variables: $ Sepal.Length: num  5.1 4.9 4.7 4.6 5 5.4 4.6 5 4.4 4.9 ... $ Sepal.Width : num  3.5 3 3.2 3.1 3.6 3.9 3.4 3.4 2.9 3.1 ... $ Petal.Length: num  1.4 1.4 1.3 1.5 1.4 1.7 1.4 1.5 1.4 1.5 ... $ Petal.Width : num  0.2 0.2 0.2 0.2 0.2 0.4 0.3 0.2 0.2 0.1 ... $ Species     : Factor w/ 3 levels "setosa","versicolor",..: 1 1 1 1 1 1 1 1 1 1 ...by(iris[,1:4],iris$Species,colMeans)iris$Species: setosaSepal.Length  Sepal.Width Petal.Length  Petal.Width       5.006        3.428        1.462        0.246 ---- iris$Species: versicolorSepal.Length  Sepal.Width Petal.Length  Petal.Width       5.936        2.770        4.260        1.326 ---- iris$Species: virginicaSepal.Length  Sepal.Width Petal.Length  Petal.Width       6.588        2.974        5.552        2.026

本文連結http://www.xueqing.tv/cms/article/158

文章來源:雪晴數據網

相關焦點

  • R語言向量化運算:apply函數族用法心得
    R語言和Python的忠實擁躉,為成為一名未來的數據科學家而奮鬥終生。個人公眾號:數據科學家養成記 (微信ID:louwill12)當初入坑R語言的時候,就在各種場合看到老司機的忠告,「儘量避免使用循環!」一開始並不明白這其中的奧義,直到後來對R語言有深入接觸後,才領會R語言在向量化運算方面的強大功能。本篇內容就總結小編在使用R語言向量化運算apply函數族的一些心得體會。
  • R 語言 apply 族函數基本用法(一)
    R 語言有很多強大的循環函數,與其他程式語言(比如 Java、C/C++、Python、Julia 等)手寫循環不同,R 使用內置的循環函數會讓你的代碼更具有可讀性
  • 乾貨 掌握R語言中的apply函數族
    原因在於R的循環操作for和while,都是基於R語言本身來實現的,而向量操作是基於底層的C語言函數實現的,從性能上來看,就會有比較明顯的差距了。那麼如何使用C的函數來實現向量計算呢,就是要用到apply的家族函數,包括apply, sapply, tapply, mapply, lapply, rapply, vapply, eapply等。
  • 【R知識】R語言apply函數族筆記
    現在我的看法傾向於,R不是一種通用型的程式語言,而是一種統計領域的軟體工具。因此,不能用通用型編程的思維來設計R代碼。在    Andrew Lim 關於R和Python的對比回答中,R是一種面向數組(array-oriented)的語法,它更像數學,方便科學家將數學公式轉化為R代碼。而Python是一種通用程式語言,更工程化。在使用R時,要儘量用array的方式思考,避免for循環。
  • R語言中的apply函數族
    前言apply函數族是R語言中數據處理的一組核心函數,通過使用apply函數,我們可以實現對數據的循環、分組、過濾、類型控制等操作
  • 【R函數學習】R語言 apply函數家族詳解
    applyApply Functions Over Array Margins對陣列行或者列使用函數apply
  • R語言 apply函數家族詳解
    來自Conda的新浪博客apply {base}通過對數組或者矩陣的一個維度使用函數生成值得列表或者數組
  • apply家族
    ()函數是一個很R語言的函數,可以起到很好的替代冗餘的for循環的作用,R語言的循環操作for和while,都是基於R語言本身來實現的,而向量操作是基於底層的C語言函數實現的,所以使用apply()家族進行向量計算是高性價比的。
  • Pandas數據處理|apply()函數的常規用法
    本文介紹一下關於 Pandas 中 apply() 函數的幾個常見用法,apply() 函數的自由度較高,可以直接對 Series 或者 DataFrame 中元素進行逐元素遍歷操作,方便且高效,具有類似於 Numpy 的特性。
  • 成為R語言高手:再談apply和for loop循環
    用過一段時間R的朋友估計對R語言的for loop循環和apply函數孰優孰劣問題都不會陌生,網絡上可以找到很多討論,知乎上類似的問題也不少,可以看到大多數的意見是不要用
  • R語言——使用apply function替代for loop循環語句
    既然難的做不了,今天就先講個簡單的,R語言裡面for loop的替代者apply function。當想到循環的時候,我們一般都是指for或者while等等。雖然我個人非常喜歡使用for loop,但是不得不承認,for loop的運算速度相對來說並沒有那麼快。
  • R數據分析:apply()的各種變體你分清了嗎?
    apply函數可以看作是循環的替代方法,在R語言中,apply函數的變體有很多,好多時候同學搞不清到底該用apply呢,還是tapply呢還是sapply
  • R語言的數據管理
    如果你學習R語言,熟練的掌握help的用法, help文檔1000多次,那麼R語言基本上就是很熟練了。判斷:is.na注意:缺失值不可比較,無法用比較運算符檢測;R語言有專門符號來表示無限大(+ inf,-inf)和不可能的值(NaN)分析中注意各個函數對缺失值的處理,可以使用na.omit()刪除所有含有缺失數據的行。
  • R語言中plyr包
    文章轉載自哈爾濱商業大學銀河統計工作室前言  apply族函數是R語言中很有特色的一類函數,包括了apply、sapply、lapply、tapply
  • R語言從入門到精通:Day6-R語言數據操作進階及控制結構
    數據如下:考試排名對大家一定不是一件陌生的事情,可是這次的排名卻有點不一樣,因為這三個科目的分值的均值和方差相差太大,如果直接比較總分就太便宜數學好的同學了吧!所以我們要找到將三個科目的分值轉化為可比較的單元,然後將學生按成績排名分類(相信大家還記得前幾次教程裡面的變量的重編碼),最後按照姓名排序,這樣就完美的解決了這個難題。
  • 如何高效運行R語言
    R語言的很多基礎函數也是用C語言寫的,你可以認為R函數是對C語言函數的包裝,方便用戶的調用。如何在R中編寫並調用C函數呢?請參考:在R語言中寫一個C函數提高R運行效率的另一個策略是儘可能少的調用函數。apply族函數常見的apply族函數有如下一些:個人使用習慣不同,本人最常使用的是apply和lapply。apply族函數具體用法不在此處做詳細介紹。
  • 【R函數學習】R語言時間序列函數整理
    #arma模型library(fUnitRoots) #進行單位根檢驗library(FinTS) #調用其中的自回歸檢驗函數library(fGarch) #GARCH模型library(nlme) #調用其中的gls函數library(fArma) #進行擬合和檢驗【基本函數
  • Pandas高級應用(map()與apply()函數)
    一.map()函數import pandas
  • JavaScript中apply、call、bind的區別與用法
    三者都可以改變this的指向,將函數綁定到上下文中。1. 語法1.1 Function.prototype.apply()apply() 方法調用一個函數, 其具有一個指定的this值,以及作為一個數組(或類似數組的對象)提供的參數。
  • R中強大的apply、tapply、lapply、sapply、mapply家族
    批量處理函數有很重要的apply族函數:lapply sapply apply tapply mapply。