tapply() 和不規則陣列沿用前面的例子,假定我們有這些稅務會計師的 收入資訊並且保存在另外一個向量中(適當的貨幣 單位)
> incomes <- c(60, 49, 40, 61, 64, 60, 59, 54, 62, 69, 70, 42, 56,
61, 61, 61, 58, 51, 48, 65, 49, 49, 41, 48, 52, 46,
59, 46, 58, 43)
為計算樣本中每個州的平均收入,我們可以
用函數 tapply():
> incmeans <- tapply(incomes, statef, mean)
這將給出一個均值向量。各個元素都用對應的水準名字標記了。
act nsw nt qld sa tas vic wa
44.500 57.333 55.500 53.600 55.000 60.500 56.000 52.250
函數 tapply() 將一個函數(這裏是
mean())用於第二個參數
1(這裏是statef)
定義於第一個參數(這裏是incomes)
上得到的所有組。此時,各個組的資料
好像是獨立的
向量。得到的結果向量長度
和因數的水準數一致。讀者
可以通過幫助文檔得到更多的資訊。
假定我們進一步想計算各個州的標準誤(standard error)2。
我們寫了一個 R 函數來計算
任一給定向量的標準誤。既然已經有內置函數
var() 計算樣本方差,這個函數
可以在一行寫完,並且有一個參數等待賦值:
> stderr <- function(x) sqrt(var(x)/length(x))
(編寫函數可以參考後面的內容 Writing your own functions。這裏的寫的標準誤演示函數其實是沒有必要的,因為 R
有一個內置計算標準誤的函數 sd()。)
賦值後,標準誤被計算出來
> incster <- tapply(incomes, statef, stderr)
值分別為
> incster
act nsw nt qld sa tas vic wa
1.5 4.3102 4.5 4.1061 2.7386 0.5 5.244 2.6575
作為一個練習,你可能想計算州平均收入的95%信度區間。
於是,你可以再次使用 tapply()
和能得到樣本量的函數 length(),以及能得到t-分佈的分位元數的函數
qt()。
(你需要研究一下 R 為t-檢驗
設計的工具。)
函數 tapply() 還可以用來處理一個由多個分類因數決定的向量
下標組合。例如,我們可能
期望通過州名和性別把這稅務會計師分類。不過,就在上面最
簡單的情況中(僅僅一個變數),我們也可以這樣考慮這個問題(複雜因數組合時一樣處理)。
向量中的值可以根據因數中不同的水準分成
許多組。函數就是獨立的用於這些組。得到的值
是這些函數結果的向量,並且以
因數的水準屬性標記。
因為子類的大小是不規則的,所以向量和作為標籤的因數的組合就是我們偶爾會提及的 不規則陣列(ragged array)一個特例罷了。 當子類大小是一致的時候, 索引最有效,正如我們 在下一節中所看到的一樣。