當前位置: 首頁>>編程示例 >>用法及示例精選 >>正文


R lapply 對列表或向量應用函數

R語言 lapply 位於 base 包(package)。

說明

lapply 返回與 X 長度相同的列表,其中每個元素是將 FUN 應用於 X 的相應元素的結果。

sapplylapply 的用戶友好版本和包裝器,默認情況下通過應用 simplify2array() 返回向量、矩陣,或者如果 simplify = "array" 則返回數組(如果適用)。 sapply(x, f, simplify = FALSE, USE.NAMES = FALSE)lapply(x, f) 相同。

vapplysapply 類似,但具有預先指定的返回值類型,因此使用起來更安全(有時更快)。

replicatesapply 的常用包裝器,用於重複計算表達式(通常涉及隨機數生成)。

simplify2array() 是當 simplify 不為 false 時從 sapply() 調用的實用程序,並且類似地從 mapply() 調用。

用法

lapply(X, FUN, ...)

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

vapply(X, FUN, FUN.VALUE, ..., USE.NAMES = TRUE)

replicate(n, expr, simplify = "array")

simplify2array(x, higher = TRUE, except = c(0L, 1L))

參數

X

向量(原子或列表)或 expression 對象。其他對象(包括分類對象)將被 base::as.list 強製。

FUN

應用於 X 的每個元素的函數:請參閱“詳細信息”。對於 +%*% 等函數,函數名稱必須用反引號或引號引起來。

...

FUN 的可選參數。

simplify

邏輯或字符串;如果可能的話,結果應該簡化為向量、矩陣還是更高維的數組?對於sapply,它必須被命名而不是縮寫。默認值 TRUE 在適當的情況下返回向量或矩陣,而如果 simplify = "array" 則結果可能是 “rank” ( length(dim(.)) ) 的 array ,比 FUN(X[[i]]) 的結果高一。

USE.NAMES

邏輯性;如果 TRUEX 是字符,則使用 X 作為結果的 names,除非它已經有名稱。由於該參數遵循...,因此其名稱不能縮寫。

FUN.VALUE

(廣義)向量; FUN 返回值的模板。查看具體信息'。

n

整數:重複次數。

expr

要重複計算的表達式(language object,通常是調用)。

x

一個列表,通常從 lapply() 返回。

higher

邏輯性;如果為 true,simplify2array() 將在適當的時候生成 (“higher rank”) 數組,而 higher = FALSE 將僅返回矩陣(或向量)。這兩種情況分別對應於 sapply(*, simplify = "array")simplify = TRUE

except

整數向量或NULL;默認 c(0L, 1L) 對應於 sapply 使用的異常:具有公共長度 0 或 1 的元素的列表不會簡化為數組,而是分別按原樣或未列出返回。可以通過僅指定 0:1NULL 的子集來禁用這些異常,以始終簡化為數組(如果可能)。

細節

FUN 通過調用 match.fun 找到,通常指定為函數或符號(例如,反引號名稱)或字符串,指定要從調用 lapply 的環境中搜索的函數。

函數 FUN 必須能夠接受 X 的任何元素作為輸入。如果後者是原子向量,則 FUN 將始終傳遞與 X 類型相同的長度為 1 的向量。

... 中的參數不能與任何其他參數同名,並且可能需要注意避免與 FUN 部分匹配。在通用代碼中,如果傳遞 ...,最好將前兩個參數命名為 XFUN:這既可以避免與 FUN 部分匹配,又可以確保在參數存在時給出合理的錯誤消息名為 XFUN 的傳遞通過 ...

僅當 X 的長度大於零並且 X 的所有元素的返回值都具有相同(正)長度時,才會嘗試 sapply 中的簡化。如果公共長度為 1,則結果是一個向量,如果大於 1,則結果是一個矩陣,其中的列對應於 X 的每個元素。

簡化始終在 vapply 中完成。此函數檢查 FUN 的所有值是否與 FUN.VALUE 兼容,因為它們必須具有相同的長度和類型。 (類型可以在邏輯 < 整數 < 雙精度 < 複雜排序中提升為更高類型,但不能降級。)

S4 類的用戶應將列表傳遞給 lapplyvapply :內部強製由基本命名空間中的 as.list 完成,而不是由用戶定義的(例如,通過在基本函數上設置 S4 方法) 。

對於 lapplysapply(simplify = FALSE)replicate(simplify = FALSE) ,一個列表。

對於 sapply(simplify = TRUE)replicate(simplify = TRUE) :如果 X 的長度為零或 n = 0 ,則為空列表。否則為與 X 長度相同的原子向量或矩陣或列表(對於 replicate ,長度為 n )。如果發生簡化,則在將pairlists強製為列表之後,輸出類型由層次結構中返回值的最高類型確定:NULL < raw <邏輯<整數< double

vapply 返回與 FUN.VALUE 匹配的類型的向量或數組。如果length(FUN.VALUE) == 1返回與X長度相同的向量,否則返回數組。如果 FUN.VALUE 不是 array ,則結果是具有 length(FUN.VALUE) 行和 length(X) 列的矩陣,否則是具有 dim(a) == c(dim(FUN.VALUE), length(X)) 的數組 a

如果已命名,則數組值的 (Dim) 名稱取自 FUN.VALUE,否則取自第一個函數調用的結果。矩陣的列名稱或更一般地數組值的最後一維的名稱或向量值的名稱從 X 設置,如 sapply 中。

注意

sapply(*, simplify = FALSE, USE.NAMES = FALSE) 等價於 lapply(*)

由於曆史原因, lapply 創建的調用未被評估,並且已經編寫了依賴於此的代碼(例如, bquote )。這意味著錄製的調用始終采用 FUN(X[[i]], ...) 形式,其中 i 替換為當前(整數或雙精度)索引。這通常不是問題,但如果 FUN 使用 sys.callmatch.call 或者它是使用該調用的原始函數,則可能會出現問題。這意味著使用包裝器調用原始函數通常更安全,因此例如需要 lapply(ll, function(x) is.numeric(x)) 來確保 is.numeric 的方法分派正確發生。

如果 expr 是函數調用,請注意有關其求值位置的假設,特別是 ... 可能引用的內容。您可以將附加命名參數傳遞給函數調用,作為 replicate 的附加命名參數:請參閱“示例”。

例子

require(stats); require(graphics)

x <- list(a = 1:10, beta = exp(-3:3), logic = c(TRUE,FALSE,FALSE,TRUE))
# compute the list mean for each list element
lapply(x, mean)
# median and quartiles for each list element
lapply(x, quantile, probs = 1:3/4)
sapply(x, quantile)
i39 <- sapply(3:9, seq) # list of vectors
sapply(i39, fivenum)
vapply(i39, fivenum,
       c(Min. = 0, "1st Qu." = 0, Median = 0, "3rd Qu." = 0, Max. = 0))

## sapply(*, "array") -- artificial example
(v <- structure(10*(5:8), names = LETTERS[1:4]))
f2 <- function(x, y) outer(rep(x, length.out = 3), y)
(a2 <- sapply(v, f2, y = 2*(1:5), simplify = "array"))
a.2 <- vapply(v, f2, outer(1:3, 1:5), y = 2*(1:5))
stopifnot(dim(a2) == c(3,5,4), all.equal(a2, a.2),
          identical(dimnames(a2), list(NULL,NULL,LETTERS[1:4])))

hist(replicate(100, mean(rexp(10))))

## use of replicate() with parameters:
foo <- function(x = 1, y = 2) c(x, y)
# does not work: bar <- function(n, ...) replicate(n, foo(...))
bar <- function(n, x) replicate(n, foo(x = x))
bar(5, x = 3)

參考

Becker, R. A., Chambers, J. M. and Wilks, A. R. (1988) The New S Language. Wadsworth & Brooks/Cole.

也可以看看

applytapplymapply 用於將函數應用於多個參數,rapply 用於 lapply() 的遞歸版本、eapply 用於將函數應用於 environment 中的每個條目。

相關用法


注:本文由純淨天空篩選整理自R-devel大神的英文原創作品 Apply a Function over a List or Vector。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。