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


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