R 學習筆記《七》 R語言初學者指南--簡單函數

R提供了計算單變量,多變量和觀察值子集的均值,長度,標準差,最小值,最大值,方差等的函數。app

1 tapply函數函數

首先載入實驗數據對象

Veg <- read.table(file = "Vegetation2.txt",header = TRUE)
names(Veg)
 [1] "TransectName" "Samples"      "Transect"     "Time"       
 [5] "R"            "ROCK"         "LITTER"       "ML"         
 [9] "BARESOIL"     "FallPrec"     "SprPrec"      "SumPrec"    
[13] "WinPrec"      "FallTmax"     "SprTmax"      "SumTmax"    
[17] "WinTmax"      "FallTmin"     "SprTmin"      "SumTmin"    
[21] "WinTmin"      "PCTSAND"      "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 ...
 $ ML          : int  0 0 0 0 4 0 4 0 2 1 ...
 $ BARESOIL    : num  26 28 30 16 9 23 19 33 29 41 ...
 $ FallPrec    : num  30.2 99.6 43.4 54.9 24.4 ...
 $ SprPrec     : num  75.4 56.1 65 58.7 87.6 ...
 $ SumPrec     : num  125.5 95 112.3 70.3 81.8 ...
 $ WinPrec     : num  39.6 107.4 76.7 90.7 46 ...
 $ FallTmax    : num  17 14.6 18.4 17.2 18.5 ...
 $ SprTmax     : num  15.8 15.2 12.8 14 14.3 ...
 $ SumTmax     : num  25.2 24.9 25.5 26.7 26 ...
 $ WinTmax     : num  3.47 1.16 3.09 2.46 5.72 ...
 $ FallTmin    : num  0.49 -0.18 1.23 1.43 1.09 ...
 $ SprTmin     : num  0.36 0.18 -1.86 -0.53 0.75 ...
 $ SumTmin     : num  6.97 6.4 7.12 7.2 6.9 ...
 $ WinTmin     : num  -8.54 -10.76 -8.5 -8.28 -7.56 ...
 $ PCTSAND     : int  24 24 24 24 24 24 24 20 20 20 ...
 $ PCTSILT     : int  30 30 30 30 30 30 30 34 34 34 ...
 $ PCTOrgC     : num  0.0346 0.0346 0.0346 0.0346 0.0346 ...

  

1.1 計算時間截面的均值blog

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  9.250000 12.375000 11.500000
[8] 10.500000 11.833333

  

變量m表示時間截面的平均豐富度,m1到m8表示每一個時間截面的平均豐富度,mean命令使用的對象是數據向量Veg$R,它不是矩陣因此不必在方括號中加入逗號ip

 

1.2 更高效的計算每一個時間截面的均值get

tapply(Veg$R,Veg$Transect,mean)
        1         2         3         4         5         6         7 
 7.571429  6.142857 10.375000  9.250000 12.375000 11.500000 10.500000 
        8
11.833333

  

tapply函數根據第二個變量(Transect)的不一樣水平對第一個變量R進行了求平均值運算string

 

。命令還能夠寫爲:io

tapply(X=Veg$R,INDEX=Veg$Transect,FUN=mean)
        1         2         3         4         5         6         7 
 7.571429  6.142857 10.375000  9.250000 12.375000 11.500000 10.500000 
        8
11.833333

 

除了求均值意外還能夠求標準差sd,方差var,長度length等等table

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

  

2 sapply函數和lapply函數class

sapply(Veg[,5:9],FUN=mean)
        R      ROCK    LITTER        ML  BARESOIL 
 9.965517 20.991379 22.853448  1.086207 17.594828 
lapply(Veg[,5:9],FUN=mean)
$R
[1] 9.965517
 
$ROCK
[1] 20.99138
 
$LITTER
[1] 22.85345
 
$ML
[1] 1.086207
 
$BARESOIL
[1] 17.59483

  

sapply函數輸出一個向量,lapply輸出一個列表

 

tapply函數計算的是一個變量觀察值子集的均值,而sapply和lapply計算的是一個或多個變量所有觀察值的均值

另外,sapply和lapply中的數據必須是數據框,下面這個命令的記過將是一個很長的向量,緣由就是cbind輸出的不是數據框

sapply(cbind(Veg$R,Veg$LITTER,Veg$ROCK,Veg$ML,Veg$BARESOIL),FUN=mean)
  [1]  8.0  6.0  8.0  8.0 10.0  7.0  6.0  5.0  8.0  6.0  6.0  6.0  6.0  6.0
 [15]  7.0 10.0  8.0 18.0 12.0 11.0  7.0 10.0  8.0  9.0  6.0 12.0 13.0 10.0
 [29]  8.0  8.0 13.0 16.0  9.0 14.0 11.0 13.0 11.0 12.0  9.0 10.0 14.0 14.0
 [43] 10.0 14.0  9.0 12.0 11.0 12.0 14.0  9.0  5.0 12.0  9.0 10.0 16.0 12.0
 [57] 10.0 14.0 30.0 20.0 24.0 35.0 22.0 26.0 19.0 26.0 24.0 16.0 25.0 28.0
 [71] 41.5 18.0 17.0  7.0 14.0 15.0 37.0 17.0 14.0 19.0 10.0  5.0  9.0 12.0
 [85] 24.0 10.0 18.0  9.0 23.0 21.0 51.0 34.0 28.0 30.0 32.0 29.0 32.0 20.0
 [99] 29.0 19.0 23.0 32.0 22.5 28.0 26.0 29.0 23.0 40.0 14.5 21.0 24.0 15.0

  

而下面這條命令轉化成數據框就能夠成功

sapply(data.frame(cbind(Veg$R,Veg$LITTER,Veg$ROCK,Veg$ML,Veg$BARESOIL)),FUN=mean)
       X1        X2        X3        X4        X5
 9.965517 22.853448 20.991379  1.086207 17.594828

  

3 summary函數

 

summay函數能夠提供變量的信息,它的參數能夠是一個變量,cbind命令的輸出或者數據框

eg:

Z <- cbind(Veg$R,Veg$ROCK,Veg$LITTER)
colnames(Z) <- c("R","ROCK","LITTER")
summary(Z)
       R               ROCK           LITTER     
 Min.   : 5.000   Min.   : 0.00   Min.   : 5.00  
 1st Qu.: 8.000   1st Qu.: 7.25   1st Qu.:17.00  
 Median :10.000   Median :18.50   Median :23.00  
 Mean   : 9.966   Mean   :20.99   Mean   :22.85  
 3rd Qu.:12.000   3rd Qu.:27.00   3rd Qu.:28.75  
 Max.   :18.000   Max.   :59.00   Max.   :51.00  

  

summay命令給出了變量的最小值,第一四分位數,中位數,平均值,第三四分位數和最大值

 

一下兩條命令一樣能夠達到效果

summary(Veg[,c("R","ROCK","LITTER")])
       R               ROCK           LITTER     
 Min.   : 5.000   Min.   : 0.00   Min.   : 5.00  
 1st Qu.: 8.000   1st Qu.: 7.25   1st Qu.:17.00  
 Median :10.000   Median :18.50   Median :23.00  
 Mean   : 9.966   Mean   :20.99   Mean   :22.85  
 3rd Qu.:12.000   3rd Qu.:27.00   3rd Qu.:28.75  
 Max.   :18.000   Max.   :59.00   Max.   :51.00  
summary(Veg[,c(5,6,7)])
       R               ROCK           LITTER     
 Min.   : 5.000   Min.   : 0.00   Min.   : 5.00  
 1st Qu.: 8.000   1st Qu.: 7.25   1st Qu.:17.00  
 Median :10.000   Median :18.50   Median :23.00  
 Mean   : 9.966   Mean   :20.99   Mean   :22.85  
 3rd Qu.:12.000   3rd Qu.:27.00   3rd Qu.:28.75  
 Max.   :18.000   Max.   :59.00   Max.   :51.00  

  

4 table函數

 

載入數據

Deer <- read.table(file="Deer.txt",header=TRUE,fill=TRUE)
names(Deer)
[1] "Farm"    "Month"   "Year"    "Sex"     "clas1_4" "LCT"     "KFI"   
[8] "Ecervi"  "Tb"    

  

注意加上fill=TRUE這個條件,否則會報錯:

Deer <- read.table(file="Deer.txt",header=TRUE)
錯誤於scan(file, what, nmax, sep, dec, quote, skip, nlines, na.strings,  : 
  657行沒有9元素
names(Deer)
[1] "Farm"    "Month"   "Year"    "Sex"     "clas1_4" "LCT"     "KFI"   
[8] "Ecervi"  "Tb"    
str(Deer)
'data.frame':   1182 obs. of  9 variables:
 $ Farm   : Factor w/ 28 levels "R\xd1\t02","R\xd1\t12",..: 3 3 3 3 3 3 3 3 3 3 ...
 $ Month  : int  10 10 10 10 10 10 10 10 10 10 ...
 $ Year   : int  0 0 0 0 0 0 0 0 0 0 ...
 $ Sex    : int  1 1 1 1 1 1 1 1 1 1 ...
 $ clas1_4: num  4 4 3 4 4 4 4 4 4 4 ...
 $ LCT    : num  191 180 192 196 204 190 196 200 197 208 ...
 $ KFI    : num  20.4 16.4 15.9 17.3 NA ...
 $ Ecervi : num  0 0 2.38 0 0 0 1.21 0 0.8 0 ...
 $ Tb     : int  0 0 0 0 NA 0 NA 1 0 0 ...
table(Deer$Farm)
 
R\xd1\t02 R\xd1\t12        AL        AU        BA        BE        CB 
       10        15        15        37        98        19        93 
      CRC        HB       LCV        LN       MAN        MB        MO 
       16        35         2        34        76        41       278 
       NC        NV        PA        PN        QM        RF        RO 
       32        35        11        45        75        34        44 
      SAL       SAU        SE        TI        TN      VISO        VY 
        1         3        26        21        31        15        40 

 

R\xd1\t02 R\xd1\t12這兩個東西不知緣由。上面結果說明一些農場抽取了15個樣本,一些農場抽取了98個樣本

table(Deer$Sex,Deer$Year)
    
      0   1   2   3   4   5  99
  1 100  88 157  72  78  34  21
  2  76  41 198 116  60  35   0
  3   0   9   1   0   0   0   0
  4   0   5   2   0   0   0   0

  

5 總結: 

 

tapply          根據x的不一樣水平對y使用FUN的函數   tapply(y,x,FUN=mean)

sapply          對y的每個變量使用FUN函數          sapply(y,FUN=mean)

lapply           對y的每個變量使用FUN函數          lapply(y,FUN=mean)

sd                計算y的標準差                           sd(y)

length          肯定y的長度                               length(y)

summay         計算基本信息                            summay(y)

table           計算列聯表                                table(x,y)

相關文章
相關標籤/搜索