当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


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。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。