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


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。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。