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


R tapply 对不规则数组应用函数


R语言 tapply 位于 base 包(package)。

说明

将函数应用于不规则数组的每个单元格,即应用于由某些因子的级别的唯一组合给出的每个(非空)值组或数据行。

用法

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

参数

X

一个R对象,其中一个split方法存在。通常类似于向量,允许子集化[,或 DataFrame 。

INDEX

一个或多个 factorlist,每个的长度与 X 相同。这些元素被 as.factor 强制转换为因子。也可以是一个公式,如果X是一个 DataFrame ,这很有用;请参阅 split 中的 f 参数进行解释。

FUN

要应用的函数(或函数名称),或 NULL 。对于 +%*% 等函数,函数名称必须用反引号或引号引起来。如果 FUNNULL ,tapply 返回一个向量,该向量可用于为 tapply 通常生成的 multi-way 数组添加下标。

...

FUN 的可选参数:注释部分。

default

(仅在简化为数组的情况下)数组初始化为的值array(default, dim = ..)。前R3.4.0,这是硬编码的array()的默认值NA。如果是NA(默认),答案类型的缺失值,例如NA_real_, 被选择 (as.raw(0)为了"raw")。在数字情况下,可以将其设置为,例如FUN(integer(0)),例如,在以下情况FUN = sum0或者0L.

simplify

逻辑性;如果 FALSEtapply 始终返回模式为 "list" 的数组;换句话说,具有 dim 属性的 list。如果 TRUE(默认值),则如果 FUN 始终返回标量,则 tapply 返回具有标量众数的数组。

细节

如果 FUN 不是 NULL ,则它被传递给 match.fun ,因此它可以是函数或命名函数的符号或字符串。

FUN 存在时,tapply 为每个包含任何数据的单元格调用 FUN。如果 FUN 为每个此类单元返回单个原子值(例如,函数 meanvar ),并且当 simplifyTRUE 时,tapply 返回包含这些值的 multi-way arrayNA 表示空单元格。该数组的维数与 INDEX 的组件数相同;维度中的级别数是 INDEX 的相应组件中的级别数 (nlevels() )。请注意,如果返回值具有类(例如,类 "Date" 的对象),则该类将被丢弃。

simplify = TRUE 始终返回一个数组,可能是一维的。

如果 FUN 不返回单个原子值,则 tapply 返回模式 list 的数组,其组件是对 FUN 的各个调用的值,即,结果是具有 dim 属性的列表。

当存在数组答案时,其 dimnamesINDEX 的名称命名,并基于分组因子的级别(可能在强制之后)。

对于列表结果,与空单元格对应的元素是 NULL

array2DF函数可用于将tapply返回的数组转换为数据帧,这样可能更方便进一步分析。

注意

... 参数提供的 FUN 可选参数不会划分为单元格。因此,FUN 期望其他参数的长度与 X 相同是不合适的。

例子

require(stats)
groups <- as.factor(rbinom(32, n = 5, prob = 0.4))
tapply(groups, groups, length) #- is almost the same as
table(groups)

## contingency table from data.frame : array with named dimnames
tapply(warpbreaks$breaks, warpbreaks[,-1], sum)
tapply(warpbreaks$breaks, warpbreaks[, 3, drop = FALSE], sum)

n <- 17; fac <- factor(rep_len(1:3, n), levels = 1:5)
table(fac)
tapply(1:n, fac, sum)
tapply(1:n, fac, sum, default = 0) # maybe more desirable
tapply(1:n, fac, sum, simplify = FALSE)
tapply(1:n, fac, range)
tapply(1:n, fac, quantile)
tapply(1:n, fac, length) ## NA's
tapply(1:n, fac, length, default = 0) # == table(fac)

## example of ... argument: find quarterly means
tapply(presidents, cycle(presidents), mean, na.rm = TRUE)

ind <- list(c(1, 2, 2), c("A", "A", "B"))
table(ind)
tapply(1:3, ind) #-> the split vector
tapply(1:3, ind, sum)

## Some assertions (not held by all patch propsals):
nq <- names(quantile(1:5))
stopifnot(
  identical(tapply(1:3, ind), c(1L, 2L, 4L)),
  identical(tapply(1:3, ind, sum),
            matrix(c(1L, 2L, NA, 3L), 2, dimnames = list(c("1", "2"), c("A", "B")))),
  identical(tapply(1:n, fac, quantile)[-1],
            array(list(`2` = structure(c(2, 5.75, 9.5, 13.25, 17), names = nq),
                 `3` = structure(c(3, 6, 9, 12, 15), names = nq),
                 `4` = NULL, `5` = NULL), dim=4, dimnames=list(as.character(2:5)))))

参考

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

也可以看看

便利函数 byaggregate (使用 tapply ); applylapply 及其版本 sapplymapply

array2DF 将结果转换为数据帧。

相关用法


注:本文由纯净天空筛选整理自R-devel大神的英文原创作品 Apply a Function Over a Ragged Array。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。