Next: , Previous: Factors, Up: Factors



4.2 函數 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)一個特例罷了。 當子類大小是一致的時候, 索引最有效,正如我們 在下一節中所看到的一樣。


Footnotes

[1] 注意,當第二個參數不是因數時, 函數 tapply() 同樣有效, 如 tapply(incomes, state)。這對一些其他 函數也是有效,因為必要時 R 會用 as.factor() 把參數強制轉換成因數。

[2] 譯者注:注意和“標準差”的不同