R中強大的apply、tapply、lapply、sapply、mapply家族

2021-03-02 臨床科研與meta分析

批量處理函數有很重要的apply族函數:lapply sapply apply tapply mapply。比起傳統的for,while常常能獲得更好的性能。

apply函數(對一個數組按行或者按列進行計算):

使用格式為:

apply(X, MARGIN, FUN, ...)

其中X為一個數組;MARGIN為一個向量(表示要將函數FUN應用到X的行還是列),若為1表示取行,為2表示取列,為c(1,2)表示行、列都計算。
示例代碼:

> y<-matrix(2:13,ncol=3,4)  > y            [,1] [,2] [,3][1,]    2    6   10[2,]    3    7   11[3,]    4    8   12[4,]    5    9   13 > apply(y,1,sum) [1] 18 21 24 27 > apply(y,2,mean) [1]  3.5  7.5 11.5

> apply(y,2,function(x)mean(x)+2)  [1]  5.5  9.5 13.5

函數lapply與函數sapply:

lapply的使用格式為:

lapply(X, FUN, ...)

lapply的返回值是和一個和X有相同的長度的list對象,這個list對象中的每個元素是將函數FUN應用到X的每一個元素。其中X為List對象(該list的每個元素都是一個向量),其他類型的對象會被R通過函數as.list()自動轉換為list類型。

函數sapply是函數lapply的一個特殊情形,對一些參數的值進行了一些限定,其使用格式為:

sapply(X, FUN,..., simplify = TRUE, USE.NAMES = TRUE)

sapply(*, simplify = FALSE, USE.NAMES = FALSE) 和lapply(*)的返回值是相同的。如果參數simplify=TRUE,則函數sapply的返回值不是一個list,而是一個矩陣;若simplify=FALSE,則函數sapply的返回值仍然是一個list。

> y<-list(a=1:4,b=3:6,c=5:9)  > y  $a[1] 1 2 3 4$b[1] 3 4 5 6$c[1] 5 6 7 8 9 > lapply(y,function(x)x+1)  $a[1] 2 3 4 5$b[1] 4 5 6 7$c[1]  6  7  8  9 10 > sapply(y,function(x)x+1)  $a[1] 2 3 4 5$b[1] 4 5 6 7$c[1]  6  7  8  9 10

函數mapply:

函數mapply是函數sapply的變形版,mapply 將函數 FUN 依次應用每一個參數的第一個元素、第二個元素、第三個元素上。函數mapply的使用格式如下:

mapply(FUN, ..., MoreArgs = NULL, SIMPLIFY = TRUE,USE.NAMES = TRUE)

其中參數MoreArgs表示函數FUN的參數列表。

> a<-matrix(1:12,c(3,4)) > a            [,1] [,2] [,3] [,4][1,]    1    4    7   10[2,]    2    5    8   11[3,]    3    6    9   12 > mapply(function(x,y,z)x+1+y+z,a[,1],a[,2],a[,3])  [1] 13 16 19

tapply(X, INDEX, FUN = NULL, ..., simplify = TRUE)

x是需要處理的向量,INDEX是因子(因子列表),FUN是需要執行的函數,simplify指是否簡化輸入結果(考慮sapply對於lapply的簡化)

> n <- 17 > fac <- factor(rep(1:3, length = n), levels = 1:5) > fac   [1] 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2Levels: 1 2 3 4 5 > table(fac)  fac1 2 3 4 5 6 6 5 0 0 > tapply(1:n, fac, sum)   1  2  3  4  5 51 57 45 NA NA > tapply(1:n, fac, sum, simplify = FALSE)  $`1`[1] 51$`2`[1] 57$`3`[1] 45$`4`NULL$`5`NULL > tapply(1:n, fac, range) $`1`[1]  1 16$`2`[1]  2 17$`3`[1]  3 15$`4`NULL$`5`NULL

加入臨床科研討論群,請加13738062354或者pj1989zzj為好友,註明加群,就會拉你進群了。

相關焦點

  • R語言向量化運算:apply函數族用法心得
    所謂apply函數族,指的是以apply函數為核心,包括lapply, sapply, tapply, mapply, rapply, vapply, eapply等在內八個函數。先上個表格具體理解下每個函數的含義:函數名含義applyapplylapplylist applysapplysimplify list applytapplytable applymapply mutiple list apply
  • R語言中的apply函數族
    簡介由於R語言的apply家族函數是用C寫的,所以使用apply進行遍歷的執行效率遠遠高於自己編寫的循環語句。為了面向不同的數據類型,不同的返回值,apply函數組成了一個函數族,包括了8個功能類似的函數,具體如下表所示。下面我們一個一個來介紹。
  • R語言——使用apply function替代for loop循環語句
    熟悉Python的朋友想必對vectorized operations並不陌生,而apply function就相當於R的vectorized operations,雖然嚴格意義上來說使用apply並不能算是。今天我會介紹整個apply function的家族,包括apply(),lapply(),sapply(),vapply(),tapply(),mapply()。
  • 【R函數學習】R語言 apply函數家族詳解
    eapplyApply a Function Over Values in an Environment對環境中的值使用函數eapply(env, FUN, ..., all.names = FALSE, USE.NAMES = TRUE)mapplyApply a Function to Multiple List or
  • 乾貨 掌握R語言中的apply函數族
    那麼如何使用C的函數來實現向量計算呢,就是要用到apply的家族函數,包括apply, sapply, tapply, mapply, lapply, rapply, vapply, eapply等。目錄apply的家族函數apply函數lapply函數sapply函數vapply函數mapply函數tapply函數rapply函數eapply函數1. apply的家族函數apply函數族是R語言中數據處理的一組核心函數
  • R語言 apply函數家族詳解
    (x,mean)$a[1] 5.5$beta[1] 4.535125$logic[1] 0.5sapply {base}這是一個用戶友好版本,是lapply函數的包裝版。sapply(x, f, simplify=FALSE, USE.NAMES=FALSE)返回的值與lapply(x,f)是一致的。
  • 使用apply族函數進行向量化運算替代for循環
    R基礎包base的apply族函數採用向量化運算實現批量計算,相較於for循環語句其代碼更加簡潔、運行速度也更快,恰當地運用這些函數能夠極大提高代碼質量。本篇主要介紹apply族函數的apply(),lapply(),sapply(),mapply()和tapply()函數。
  • apply家族
    函數:輸入list,對list每個對象操作後返回listsapply函數:輸入list,對list每個對象操作後返回matrixvapply函數mapply函數tapply函數rapply函數eapply函數二、成員簡介
  • R數據分析:apply()的各種變體你分清了嗎?
    apply函數可以看作是循環的替代方法,在R語言中,apply函數的變體有很多,好多時候同學搞不清到底該用apply呢,還是tapply呢還是sapply
  • R點石成金三人組:apply,lapply,sapply
    首先,我們來看三人組的大哥:apply函數。apply函數是這三個函數的精髓,lapply是它的變種,sapply是lapply的精華簡潔版本。apply函數的基本命令格式是:apply(數據,向量,函數)。這個「數據、向量、函數」是什麼意思呢?
  • 【R知識】R語言apply函數族筆記
    這些函數間的關係作用目標在每個元素上應用在子集合上應用arrayapply        tapply        listlapply (...)by        其中    lapply(...)
  • R 語言 apply 族函數基本用法(一)
    ps:魔方矩陣的列加總:> apply(m, 2, sum)[1] 65 65 65 65 65列的和跟行的和是一樣的。二、lapply函數函數用法:函數前面接受兩個參數,並返回一個列表。函數作用於列表中的每一個元素上,得到列表中每個元素中的值都是唯一的,達到去重的目的。
  • R語言apply家族函數的用法及其比較
    在平常的編程過程中我們應該儘量避免使用循環,而採用向量化的編程語法可以幫助我們有效提高數據處理效率。本文我們主要介紹如何使用R語言中的apply家族函數來實現向量化運算。案例中需要用到的數據集為了更好的理解apply家族函數的用法,本文需要用到mtcars數據集和beavers數據集。
  • R語言的數據管理
    R語言提供了除了循環語句外更好的選擇:apply,sapply,lapply其中apply作用於相同數據類型的數據結構(如vector,matrix,array),而sapply和lapply作用與含有不同數據類型的數據結構(如data.frame,list)1.apply的用法apply的一般形式:apply(m,dimcode,f,fargs
  • R|數據處理|list的轉化與轉置
    ,正好l是這樣一個list,它表示該函數的多個參數,而不是第一個參數是這個list# 用sapply將每一個元素變成向量,組成一個矩陣。下面兩種寫法等價data.frame(t(sapply(l,c)))data.frame(t(sapply(l, `[`)))# 使用Reduce函數實現累加效果data.frame(Reduce(rbind, l)) # 像累加一樣,每一個元素拿出來作為rbind的參數,和之前結合的結果再一次結合data.frame 轉化為 list我們要實現如下轉化每一列作為
  • R語言中plyr包
    文章轉載自哈爾濱商業大學銀河統計工作室前言  apply族函數是R語言中很有特色的一類函數,包括了apply、sapply、lapply、tapply
  • 成為R語言高手:再談apply和for loop循環
    for loop循環,能不用就不用,儘量用apply,或者向量化。for loop和apply的爭論,本質上涉及到兩個問題:這裡說來話有點長,首先要搞清楚小的基本問題,最後我們再綜合起來討論。1)apply系列函數是什麼?R裡面有好多apply函數,比如apply,lapply,tapply至於他們到用法,我已經在別的文章裡討論過所以這裡就不討論來,如果你還沒有看到,可以關注微信公眾號:機器會學習(id:jiqihuixuexi)。
  • 「R」分析之前的數據準備
    數據轉換數據框中常用的更改變量的函數是transform,它定義如下:這個函數首先要指定一個數據框,跟著是一系列的表達式,表達式中的變量是數據框中的變量,transform函數會完成每個表達式中的計算,然後返回最終的數據框。
  • R中的泛函
    泛函介紹R中泛函非數學中的泛函,它是R中高階函數的一種。R中的高階函數與普通函數的區別是,函數的輸入或者輸出為函數。
  • R語言學習路上的憶苦思甜
    而map幹的事情和lapply是一樣的,lapply我更加熟悉一點,在當前情況下更簡單。library(dplyr)results <- data %>%   select(Year,Month,Temperature) %>%   split(.