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


R apply 在數組邊距上應用函數


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

說明

返回通過將函數應用於數組或矩陣的邊距而獲得的向量或數組或值列表。

用法

apply(X, MARGIN, FUN, ..., simplify = TRUE)

參數

X

一個數組,包括一個矩陣。

MARGIN

給出函數將應用到的下標的向量。例如,對於矩陣1 表示行,2 表示列,c(1, 2) 表示行和列。其中X已命名為dimnames,它可以是選擇維度名稱的字符向量。

FUN

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

...

FUN 的可選參數。

simplify

指示是否應在可能的情況下簡化結果的邏輯。

細節

如果 X 不是數組,而是具有非空 dim 值的類的對象(例如 DataFrame ),則 apply 嘗試通過 as.matrix 將其強製為數組(如果它是兩個)維度(例如 DataFrame )或通過 as.array

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

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

如果每次調用 FUN 返回長度為 n 的向量,並且 simplifyTRUE ,則 apply 如果 n > 1 則返回維度為 c(n, dim(X)[MARGIN]) 的數組。如果 n 等於 1 ,如果 MARGIN 的長度為 1,則 apply 返回一個向量,否則返回一個維度為 dim(X)[MARGIN] 的數組。如果 n0 ,結果的長度為 0,但不一定是 ‘correct’ 維度。

如果對 FUN 的調用返回不同長度的向量,或者如果 simplifyFALSE ,則 apply 返回長度為 prod(dim(X)[MARGIN]) 的列表,其中 dim 設置為 MARGIN(如果長度大於 1) 。

在所有情況下,在設置維度之前,as.vector 將結果強製為基本向量類型之一,以便(例如)因子結果將被強製為字符數組。

例子

## Compute row and column sums for a matrix:
x <- cbind(x1 = 3, x2 = c(4:1, 2:5))
dimnames(x)[[1]] <- letters[1:8]
apply(x, 2, mean, trim = .2)
col.sums <- apply(x, 2, sum)
row.sums <- apply(x, 1, sum)
rbind(cbind(x, Rtot = row.sums), Ctot = c(col.sums, sum(col.sums)))

stopifnot( apply(x, 2, is.vector))

## Sort the columns of a matrix
apply(x, 2, sort)

## keeping named dimnames
names(dimnames(x)) <- c("row", "col")
x3 <- array(x, dim = c(dim(x),3),
	    dimnames = c(dimnames(x), list(C = paste0("cop.",1:3))))
identical(x,  apply( x,  2,  identity))
identical(x3, apply(x3, 2:3, identity))

##- function with extra args:
cave <- function(x, c1, c2) c(mean(x[c1]), mean(x[c2]))
apply(x, 1, cave,  c1 = "x1", c2 = c("x1","x2"))

ma <- matrix(c(1:4, 1, 6:8), nrow = 2)
ma
apply(ma, 1, table)  #--> a list of length 2
apply(ma, 1, stats::quantile) # 5 x n matrix with rownames

stopifnot(dim(ma) == dim(apply(ma, 1:2, sum)))

## Example with different lengths for each call
z <- array(1:24, dim = 2:4)
zseq <- apply(z, 1:2, function(x) seq_len(max(x)))
zseq         ## a 2 x 3 matrix
typeof(zseq) ## list
dim(zseq) ## 2 3
zseq[1,]
apply(z, 3, function(x) seq_len(max(x)))
# a list without a dim attribute

參考

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

也可以看看

lapply 還有simplify2arraytapply ,以及便利函數 sweepaggregate

相關用法


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