14.2 汇总统计
我们已经了解了很多用于计算汇总统计的函数,本节算是一个小结。大多数函数的命名及其用法都显而易见,例如,mean
和median
函数的计算任务和它们的名字相同。没有求模的函数,但可以从table
函数的结果计算出来,它给出了每个元素的计数结果。(如果你了解得还不够,现在再去做一下练习13-3吧。)
在下例中,obama_vs_mccain
数据集包含在2008年美国总统选举中投票给奥巴马和麦凯恩的人口组成数据,以及一些相关的人口统计信息:
data(obama_vs_mccain, package = "learningr")
obama <- obama_vs_mccain$Obama
mean(obama)
## [1] 51.29
median(obama)
## [1] 51.38
table
函数对于Obama
变量(或其他的数值变量)来说意义不是很大,因为每个值都是唯一的。通过与cut
相结合,我们可以看见有多少值落在了不同的分组中:
table(cut(obama, seq.int(0, 100, 10)))
##
## (0,10] (10,20] (20,30] (30,40] (40,50] (50,60] (60,70] (70,80]
## 0 0 0 8 16 16 9 1
## (80,90] (90,100]
## 0 1
var
和sd
分别计算方差和标准差。用于计算平均绝对偏差的mad
函数则比较少见:
var(obama)
## [1] 123.1
sd(obama)
## [1] 11.09
mad(obama)
## [1] 11.49
有几个函数可用于获取数值数据的极值。例如,最常见的min
和max
,它们能分别给出输入的最小值和最大值。pmin
和pmax
(“并行”版本)则能计算相同长度的若干向量中在相同位置的最小和最大值。而range
函数只需一行函数就能给出最小和最大值:
min(obama)
## [1] 32.54
with(obama_vs_mccain, pmin(Obama, McCain))
## [1] 38.74 37.89 44.91 38.86 36.91 44.71 38.22 6.53 36.93 48.10 46.90
## [12] 26.58 35.91 36.74 48.82 44.39 41.55 41.15 39.93 40.38 36.47 35.99
## [23] 40.89 43.82 43.00 49.23 47.11 41.60 42.65 44.52 41.61 41.78 36.03
## [34] 49.38 44.50 46.80 34.35 40.40 44.15 35.06 44.90 44.75 41.79 43.63
## [45] 34.22 30.45 46.33 40.26 42.51 42.31 32.54
range(obama)
## [1] 32.54 92.46
cumin
和cummax
能分别计算向量中的最小值和最大值。同样地,cumsum
和cumprod
能计算数据中的累加与累乘。当输入的数据是有序的,这些函数会非常有用:
cummin(obama)
## [1] 38.74 37.89 37.89 37.89 37.89 37.89 37.89 37.89 37.89 37.89 37.89
## [12] 37.89 35.91 35.91 35.91 35.91 35.91 35.91 35.91 35.91 35.91 35.91
## [23] 35.91 35.91 35.91 35.91 35.91 35.91 35.91 35.91 35.91 35.91 35.91
## [34] 35.91 35.91 35.91 34.35 34.35 34.35 34.35 34.35 34.35 34.35 34.35
## [45] 34.22 34.22 34.22 34.22 34.22 34.22 32.54
cumsum(obama)
## [1] 38.74 76.63 121.54 160.40 221.34 275.00 335.59 428.05
## [9] 489.96 540.87 587.77 659.62 695.53 757.38 807.23 861.16
## [17] 902.71 943.86 983.79 1041.50 1103.42 1165.22 1222.55 1276.61
## [25] 1319.61 1368.84 1415.95 1457.55 1512.70 1566.83 1623.97 1680.88
## [33] 1743.76 1793.46 1837.96 1889.34 1923.69 1980.44 2034.91 2097.77
## [41] 2142.67 2187.42 2229.21 2272.84 2307.06 2374.52 2427.15 2484.49
## [49] 2527.00 2583.22 2615.76
cumprod(obama)
## [1] 3.874e+01 1.468e+03 6.592e+04 2.562e+06 1.561e+08 8.377e+09 5.076e+11
## [8] 4.693e+13 2.905e+15 1.479e+17 6.937e+18 4.984e+20 1.790e+22 1.107e+24
## [15] 5.519e+25 2.976e+27 1.237e+29 5.089e+30 2.032e+32 1.173e+34 7.261e+35
## [22] 4.487e+37 2.572e+39 1.391e+41 5.980e+42 2.944e+44 1.387e+46 5.769e+47
## [29] 3.182e+49 1.722e+51 9.841e+52 5.601e+54 3.522e+56 1.750e+58 7.789e+59
## [36] 4.002e+61 1.375e+63 7.801e+64 4.249e+66 2.671e+68 1.199e+70 5.367e+71
## [43] 2.243e+73 9.785e+74 3.349e+76 2.259e+78 1.189e+80 6.817e+81 2.898e+83
## [50] 1.629e+85 5.302e+86
可能如你所料,quantile
函数能够计算分位数(median
、min
和max
是特殊情况)。它默认计算中位数、最小值、最大值和上下四分位数,而且它令人惊叹地进行过度设计,竟然提供了9种不同的算法:
quantile(obama)
## 0% 25% 50% 75% 100%
## 32.540 42.755 51.380 57.335 92.460
quantile(obama, type = 5) # 重现SAS的结果
## 0% 25% 50% 75% 100%
## 32.54 42.63 51.38 57.34 92.46
quantile(obama, c(0.9, 0.95, 0.99))
## 90% 95% 99%
## 61.92 65.17 82.16
IQR
封装了quantile
函数,它能直接计算出四分位差(第75百分位减去第25个百分位):
IQR(obama)
## [1] 14.58
fivenum
对quantile
作了大量简化而且运行更快。你只能使用一种算法,并且只能计算出默认的位数。它很适用于对速度要求很高的那些场景:
fivenum(obama)
## [1] 32.54 42.75 51.38 57.34 92.46
有些快捷方式能够一次完成多项统计计算。例如,你已见过的能接受向量或数据框的summary
函数:
summary(obama_vs_mccain)
## State Region Obama McCain
## Alabama : 1 IV : 8 Min. :32.54 Min. : 6.53
## Alaska : 1 I : 6 1st Qu.:42.76 1st Qu.:40.39
## Arizona : 1 III : 6 Median :51.38 Median :46.80
## Arkansas : 1 V : 6 Mean :51.29 Mean :47.00
## California: 1 VIII : 6 3rd Qu.:57.34 3rd Qu.:55.88
## Colorado : 1 VI : 5 Max. :92.46 Max. :65.65
## (Other) :45 (Other):14
## Turnout Unemployment Income
## Min. :50.80 Min. :3.40 Min. :19534
## 1st Qu.:61.05 1st Qu.:5.05 1st Qu.:23501
## Median :64.90 Median :5.90 Median :25203
## Mean :64.09 Mean :6.01 Mean :26580
## 3rd Qu.:67.95 3rd Qu.:7.25 3rd Qu.:28978
## Max. :78.00 Max. :9.40 Max. :40846
## NA's :4
## Population Catholic Protestant
## Min. : 563626 Min. : 6.00 Min. :26.00
## 1st Qu.: 1702662 1st Qu.:12.00 1st Qu.:46.00
## Median : 4350606 Median :21.00 Median :54.00
## Mean : 6074128 Mean :21.67 Mean :53.84
## 3rd Qu.: 6656506 3rd Qu.:29.00 3rd Qu.:62.00
## Max. :37341989 Max. :46.00 Max. :80.00
## NA's :2 NA's :2
## Other Non.religious Black
## Min. :0.000 Min. : 5.00 Min. : 0.4
## 1st Qu.:2.000 1st Qu.:12.00 1st Qu.: 3.1
## Median :3.000 Median :15.00 Median : 7.4
## Mean :3.286 Mean :16.04 Mean :11.1
## 3rd Qu.:4.000 3rd Qu.:19.00 3rd Qu.:15.2
## Max. :8.000 Max. :34.00 Max. :50.7
## NA's :2 NA's :2
## Latino Urbanization
## Min. : 1.20 Min. : 1.2
## 1st Qu.: 4.30 1st Qu.: 45.8
## Median : 8.20 Median : 101.2
## Mean :10.32 Mean : 385.6
## 3rd Qu.:12.05 3rd Qu.: 221.4
## Max. :46.30 Max. :9856.5
cor
函数能计算数值向量之间的相关性。你可能会想到,投票给奥巴马和投票给麦凯恩的选民之间应该会有一个近乎完美的负相关关系(其中的瑕疵是由独立候选人的选民造成的)。cancor
函数(典型相关“canonical correlation”的简称)能提供更多的细节,而cov
函数能计算协方差:
with(obama_vs_mccain, cor(Obama, McCain))
## [1] -0.9981
with(obama_vs_mccain, cancor(Obama, McCain))
## $cor
## [1] 0.9981
##
## $xcoef
## [,1]
## [1,] 0.01275
##
## $ycoef
## [,1]
## [1,] -0.01287
##
## $xcenter
## [1] 51.29
##
## $ycenter
## [1] 47
with(obama_vs_mccain, cov(Obama, McCain))
## [1] -121.7