14.2 汇总统计

我们已经了解了很多用于计算汇总统计的函数,本节算是一个小结。大多数函数的命名及其用法都显而易见,例如,meanmedian函数的计算任务和它们的名字相同。没有求模的函数,但可以从table函数的结果计算出来,它给出了每个元素的计数结果。(如果你了解得还不够,现在再去做一下练习13-3吧。)

在下例中,obama_vs_mccain数据集包含在2008年美国总统选举中投票给奥巴马和麦凯恩的人口组成数据,以及一些相关的人口统计信息:

  1. data(obama_vs_mccain, package = "learningr")
  2. obama <- obama_vs_mccain$Obama
  3. mean(obama)
  4. ## [1] 51.29
  5. median(obama)
  6. ## [1] 51.38

table函数对于Obama变量(或其他的数值变量)来说意义不是很大,因为每个值都是唯一的。通过与cut相结合,我们可以看见有多少值落在了不同的分组中:

  1. table(cut(obama, seq.int(0, 100, 10)))
  2. ##
  3. ## (0,10] (10,20] (20,30] (30,40] (40,50] (50,60] (60,70] (70,80]
  4. ## 0 0 0 8 16 16 9 1
  5. ## (80,90] (90,100]
  6. ## 0 1

varsd分别计算方差和标准差。用于计算平均绝对偏差的mad函数则比较少见:

  1. var(obama)
  2. ## [1] 123.1
  3. sd(obama)
  4. ## [1] 11.09
  5. mad(obama)
  6. ## [1] 11.49

有几个函数可用于获取数值数据的极值。例如,最常见的minmax,它们能分别给出输入的最小值和最大值。pminpmax(“并行”版本)则能计算相同长度的若干向量中在相同位置的最小和最大值。而range函数只需一行函数就能给出最小和最大值:

  1. min(obama)
  2. ## [1] 32.54
  3. with(obama_vs_mccain, pmin(Obama, McCain))
  4. ## [1] 38.74 37.89 44.91 38.86 36.91 44.71 38.22 6.53 36.93 48.10 46.90
  5. ## [12] 26.58 35.91 36.74 48.82 44.39 41.55 41.15 39.93 40.38 36.47 35.99
  6. ## [23] 40.89 43.82 43.00 49.23 47.11 41.60 42.65 44.52 41.61 41.78 36.03
  7. ## [34] 49.38 44.50 46.80 34.35 40.40 44.15 35.06 44.90 44.75 41.79 43.63
  8. ## [45] 34.22 30.45 46.33 40.26 42.51 42.31 32.54
  9. range(obama)
  10. ## [1] 32.54 92.46

cumincummax能分别计算向量中的最小值和最大值。同样地,cumsumcumprod能计算数据中的累加与累乘。当输入的数据是有序的,这些函数会非常有用:

  1. cummin(obama)
  2. ## [1] 38.74 37.89 37.89 37.89 37.89 37.89 37.89 37.89 37.89 37.89 37.89
  3. ## [12] 37.89 35.91 35.91 35.91 35.91 35.91 35.91 35.91 35.91 35.91 35.91
  4. ## [23] 35.91 35.91 35.91 35.91 35.91 35.91 35.91 35.91 35.91 35.91 35.91
  5. ## [34] 35.91 35.91 35.91 34.35 34.35 34.35 34.35 34.35 34.35 34.35 34.35
  6. ## [45] 34.22 34.22 34.22 34.22 34.22 34.22 32.54
  7. cumsum(obama)
  8. ## [1] 38.74 76.63 121.54 160.40 221.34 275.00 335.59 428.05
  9. ## [9] 489.96 540.87 587.77 659.62 695.53 757.38 807.23 861.16
  10. ## [17] 902.71 943.86 983.79 1041.50 1103.42 1165.22 1222.55 1276.61
  11. ## [25] 1319.61 1368.84 1415.95 1457.55 1512.70 1566.83 1623.97 1680.88
  12. ## [33] 1743.76 1793.46 1837.96 1889.34 1923.69 1980.44 2034.91 2097.77
  13. ## [41] 2142.67 2187.42 2229.21 2272.84 2307.06 2374.52 2427.15 2484.49
  14. ## [49] 2527.00 2583.22 2615.76
  15. cumprod(obama)
  16. ## [1] 3.874e+01 1.468e+03 6.592e+04 2.562e+06 1.561e+08 8.377e+09 5.076e+11
  17. ## [8] 4.693e+13 2.905e+15 1.479e+17 6.937e+18 4.984e+20 1.790e+22 1.107e+24
  18. ## [15] 5.519e+25 2.976e+27 1.237e+29 5.089e+30 2.032e+32 1.173e+34 7.261e+35
  19. ## [22] 4.487e+37 2.572e+39 1.391e+41 5.980e+42 2.944e+44 1.387e+46 5.769e+47
  20. ## [29] 3.182e+49 1.722e+51 9.841e+52 5.601e+54 3.522e+56 1.750e+58 7.789e+59
  21. ## [36] 4.002e+61 1.375e+63 7.801e+64 4.249e+66 2.671e+68 1.199e+70 5.367e+71
  22. ## [43] 2.243e+73 9.785e+74 3.349e+76 2.259e+78 1.189e+80 6.817e+81 2.898e+83
  23. ## [50] 1.629e+85 5.302e+86

可能如你所料,quantile函数能够计算分位数(medianminmax是特殊情况)。它默认计算中位数、最小值、最大值和上下四分位数,而且它令人惊叹地进行过度设计,竟然提供了9种不同的算法:

  1. quantile(obama)
  2. ## 0% 25% 50% 75% 100%
  3. ## 32.540 42.755 51.380 57.335 92.460
  4. quantile(obama, type = 5) # 重现SAS的结果
  5. ## 0% 25% 50% 75% 100%
  6. ## 32.54 42.63 51.38 57.34 92.46
  7. quantile(obama, c(0.9, 0.95, 0.99))
  8. ## 90% 95% 99%
  9. ## 61.92 65.17 82.16

IQR封装了quantile函数,它能直接计算出四分位差(第75百分位减去第25个百分位):

  1. IQR(obama)
  2. ## [1] 14.58

fivenumquantile作了大量简化而且运行更快。你只能使用一种算法,并且只能计算出默认的位数。它很适用于对速度要求很高的那些场景:

  1. fivenum(obama)
  2. ## [1] 32.54 42.75 51.38 57.34 92.46

有些快捷方式能够一次完成多项统计计算。例如,你已见过的能接受向量或数据框的summary函数:

  1. summary(obama_vs_mccain)
  2. ## State Region Obama McCain
  3. ## Alabama : 1 IV : 8 Min. :32.54 Min. : 6.53
  4. ## Alaska : 1 I : 6 1st Qu.:42.76 1st Qu.:40.39
  5. ## Arizona : 1 III : 6 Median :51.38 Median :46.80
  6. ## Arkansas : 1 V : 6 Mean :51.29 Mean :47.00
  7. ## California: 1 VIII : 6 3rd Qu.:57.34 3rd Qu.:55.88
  8. ## Colorado : 1 VI : 5 Max. :92.46 Max. :65.65
  9. ## (Other) :45 (Other):14
  10. ## Turnout Unemployment Income
  11. ## Min. :50.80 Min. :3.40 Min. :19534
  12. ## 1st Qu.:61.05 1st Qu.:5.05 1st Qu.:23501
  13. ## Median :64.90 Median :5.90 Median :25203
  14. ## Mean :64.09 Mean :6.01 Mean :26580
  15. ## 3rd Qu.:67.95 3rd Qu.:7.25 3rd Qu.:28978
  16. ## Max. :78.00 Max. :9.40 Max. :40846
  17. ## NA's :4
  18. ## Population Catholic Protestant
  19. ## Min. : 563626 Min. : 6.00 Min. :26.00
  20. ## 1st Qu.: 1702662 1st Qu.:12.00 1st Qu.:46.00
  21. ## Median : 4350606 Median :21.00 Median :54.00
  22. ## Mean : 6074128 Mean :21.67 Mean :53.84
  23. ## 3rd Qu.: 6656506 3rd Qu.:29.00 3rd Qu.:62.00
  24. ## Max. :37341989 Max. :46.00 Max. :80.00
  25. ## NA's :2 NA's :2
  26. ## Other Non.religious Black
  27. ## Min. :0.000 Min. : 5.00 Min. : 0.4
  28. ## 1st Qu.:2.000 1st Qu.:12.00 1st Qu.: 3.1
  29. ## Median :3.000 Median :15.00 Median : 7.4
  30. ## Mean :3.286 Mean :16.04 Mean :11.1
  31. ## 3rd Qu.:4.000 3rd Qu.:19.00 3rd Qu.:15.2
  32. ## Max. :8.000 Max. :34.00 Max. :50.7
  33. ## NA's :2 NA's :2
  34. ## Latino Urbanization
  35. ## Min. : 1.20 Min. : 1.2
  36. ## 1st Qu.: 4.30 1st Qu.: 45.8
  37. ## Median : 8.20 Median : 101.2
  38. ## Mean :10.32 Mean : 385.6
  39. ## 3rd Qu.:12.05 3rd Qu.: 221.4
  40. ## Max. :46.30 Max. :9856.5

cor函数能计算数值向量之间的相关性。你可能会想到,投票给奥巴马和投票给麦凯恩的选民之间应该会有一个近乎完美的负相关关系(其中的瑕疵是由独立候选人的选民造成的)。cancor函数(典型相关“canonical correlation”的简称)能提供更多的细节,而cov函数能计算协方差:

  1. with(obama_vs_mccain, cor(Obama, McCain))
  2. ## [1] -0.9981
  3. with(obama_vs_mccain, cancor(Obama, McCain))
  4. ## $cor
  5. ## [1] 0.9981
  6. ##
  7. ## $xcoef
  8. ## [,1]
  9. ## [1,] 0.01275
  10. ##
  11. ## $ycoef
  12. ## [,1]
  13. ## [1,] -0.01287
  14. ##
  15. ## $xcenter
  16. ## [1] 51.29
  17. ##
  18. ## $ycenter
  19. ## [1] 47
  20. with(obama_vs_mccain, cov(Obama, McCain))
  21. ## [1] -121.7