這裡介紹 R 的一些常用函數,以及如何使用這些函數對資料進行基本的分析工作。

R 中有一些函數可以讓我們在處理資料時更快速、更方便,雖然這些不是分析資料必要的函數,不過在某些情況下運用這些函數可以讓整個資料的分析流程更順暢。

tapply 函數

R 提供了各式各樣可以對數值做計算的函數,除了對單一變數做計算的函數之外,有些特別的函數也可以同時對多個變數或子集合做運算,我們拿 vegetation 這個資料來做一個例子,這個資料是黃石國家公園(Yellowstone National Park)與 National Bison Range 所觀測到的草原生態資料,研究的目的在於觀察這裡的生物多樣性是否有隨著時間而改變。

首先把資料讀進 R 中:

Veg <- read.table(file="Vegetation2.txt", header= TRUE)
names(Veg)

輸出為:

 [1] "TransectName" "Samples"     
 [3] "Transect"     "Time"        
 [5] "R"            "ROCK"        
 [7] "LITTER"       "ML"          
 [9] "BARESOIL"     "FallPrec"    
[11] "SprPrec"      "SumPrec"     
[13] "WinPrec"      "FallTmax"    
[15] "SprTmax"      "SumTmax"     
[17] "WinTmax"      "FallTmin"    
[19] "SprTmin"      "SumTmin"     
[21] "WinTmin"      "PCTSAND"     
[23] "PCTSILT"      "PCTOrgC"
str(Veg)

輸出為

'data.frame':	58 obs. of  24 variables:
 $ TransectName: Factor w/ 58 levels "A_22_02","A_22_58",..: 2 3 4 5 6 7 1 9 10 11 ...
 $ Samples     : int  1 2 3 4 5 6 7 8 9 10 ...
 $ Transect    : int  1 1 1 1 1 1 1 2 2 2 ...
 $ Time        : int  1958 1962 1967 1974 1981 1994 2002 1958 1962 1967 ...
 $ R           : int  8 6 8 8 10 7 6 5 8 6 ...
 $ ROCK        : num  27 26 30 18 23 26 39 25 24 21 ...
 $ LITTER      : num  30 20 24 35 22 26 19 26 24 16 ...
[略]

假設我們想要看看不同的 Veg$Transect 是否會對 Veg$R 造成影響,最直接的方式就是依照 Veg$Transect 的值來區分群組,計算每一個群組的 Veg$R 平均值:

m <- mean(Veg$R)
m1 <- mean(Veg$R[Veg$Transect == 1])
m2 <- mean(Veg$R[Veg$Transect == 2])
m3 <- mean(Veg$R[Veg$Transect == 3])
m4 <- mean(Veg$R[Veg$Transect == 4])
m5 <- mean(Veg$R[Veg$Transect == 5])
m6 <- mean(Veg$R[Veg$Transect == 6])
m7 <- mean(Veg$R[Veg$Transect == 7])
m8 <- mean(Veg$R[Veg$Transect == 8])
c(m, m1, m2, m3, m4, m5, m6, m7, m8)

輸出為

[1]  9.965517  7.571429  6.142857 10.375000
[5]  9.250000 12.375000 11.500000 10.500000
[9] 11.833333

這裡的 m 是所有 Veg$R 的平均值(不分群組),而 m1m8 則是依照每一個 Veg$Transect 數值分群所計算的 Veg$R 平均值,很顯然這樣手動計算每一個群組平均值的方式並不是一個很聰明的作法,這時候可以使用 R 的 tapply 函數,它可以達到同樣的功能,但是只需要一行指令:

tapply(Veg$R, Veg$Transect, mean)

輸出為

        1         2         3         4 
 7.571429  6.142857 10.375000  9.250000 
        5         6         7         8 
12.375000 11.500000 10.500000 11.833333

若以具名參數的方式執行,看起來會更清楚:

tapply(X = Veg$R, INDEX = Veg$Transect, FUN = mean)

tapply 函數會以 INDEX 變數為依據,將 X 變數先分成數個群組,再將每一個群組的資料套用 FUN 函數做運算,以下是套用各種不同函數的範例:

Me <- tapply(Veg$R, Veg$Transect, mean)
Sd <- tapply(Veg$R, Veg$Transect, sd)
Le <- tapply(Veg$R, Veg$Transect, length)
cbind(Me, Sd, Le)

輸出為:

         Me        Sd Le
1  7.571429 1.3972763  7
2  6.142857 0.8997354  7
3 10.375000 3.5831949  8
4  9.250000 2.3145502  8
5 12.375000 2.1339099  8
6 11.500000 2.2677868  8
7 10.500000 3.1464265  6
8 11.833333 2.7141604  6

這個輸出列出了各個群組的 Veg$R 平均值、標準差以及樣本數。

FUN 可以指定為各種 R 的內建函數,甚至也可以使用自己訂的函數。