R语言ETL系列:汇总(summarise)

浏览: 1542

作者:黄天元,复旦大学博士在读,目前研究涉及文本挖掘、社交网络分析和机器学习等。希望与大家分享学习经验,推广并加深R语言在业界的应用。

邮箱:huang.tian-yuan@qq.com


本章讲解如何使用summarise函数完成数据的汇总。在开讲之前,我们需要理解,什么叫做汇总。举个例子,如果我们现在对学校的学生身高进行了测量,我们需要得到学生的平均身高,那么我们把所有学生的身高加起来,除以学生的数量,得到身高平均值,这就完成了一个汇总计算。汇总计算的方式多种多样,比如我们要得到最高的身高是多少,最低的身高是多少,身高是中位数是多少,这些都是汇总计算。
在数据表中,数据的汇总的实质就是:我们根据一列数据(本质来说是一个向量),得到一个值,来反映总体在这个属性上的特征。本章会用到R语言自带cars数据集,下面我们先加载需要的包,并把cars转化为tibble,存放在cars1变量中。它只包含两列数据,第一列是汽车的即时速度,第二列是这个速度下要停止下来会继续跑多远。

 1library(tidyverse)
2cars %>% as_tibble() -> cars1
3cars1
4## # A tibble: 50 x 2
5##    speed  dist
6##    <dbl> <dbl>
7##  1     4     2
8##  2     4    10
9##  3     7     4
10##  4     7    22
11##  5     8    16
12##  6     9    10
13##  7    10    18
14##  8    10    26
15##  9    10    34
16## 10    11    17
17## # ... with 40 more rows

汇总基本范式

均值和中位数代表了数据的一般水平,是重要的衡量指标。下面我们看看如何汇总测试的平均值和中位数。

 1#平均速度
2cars1 %>%
3  summarise(mean(speed))
4## # A tibble: 1 x 1
5##   `mean(speed)`
6##           <dbl>
7## 1          15.4
8#速度的中位数
9cars1 %>% 
10  summarise(median(speed))
11## # A tibble: 1 x 1
12##   `median(speed)`
13##             <dbl>
14## 1              15

SQL代码分别为:

<SQL> SELECT AVG(`speed`) AS `mean(speed)`
FROM `cars1`

<SQL> SELECT MEDIAN(`speed`) AS `median(speed)`
FROM `cars1`

注意,我们这里没有给最后的结果命名,因此结果中默认原来的值为命名,也就是说mean(speed)成为了列的名称,事实上我们可以通过赋值来改变它,例子如下:

1cars1 %>%
2  summarise(speed_avg = mean(speed))
3## # A tibble: 1 x 1
4##   speed_avg
5##       <dbl>
6## 1      15.4

现在得到结果的名称就变为speed_avg了,相应的SQL代码如下所示:

<SQL> SELECT AVG(`speed`) AS `speed_avg`
FROM `cars1`

汇总函数总结

但是基本模式与上面一致,比如我们要知道速度这一列的标准差:

1cars1 %>% 
2  summarise(speed_sd = sd(speed))
3## # A tibble: 1 x 1
4##   speed_sd
5##      <dbl>
6## 1     5.29

与求均值的例子相比较,我们知识改变了最后的列名称speed_sd,以及求值函数sd。我们会通过变化求值函数来进行不同的汇总,首先给大家介绍不同的汇总求值函数。

  • 中心化汇总:平均值(mean)、中位数(median)

  • 离散化汇总:标准差(sd)、四分位距(IQR)、绝对中位差(mad)

  • 范围汇总:最大值(max)、最小值(min)、分位数(quantile)

  • 位置汇总:首位(first)、末位(last)、自定义位置(nth)

  • 计数汇总:简单计数(n)、种类计数(n_distinct)

  • 逻辑汇总:最少满足(any)、全部满足(all)

汇总函数示例

上一节中我们介绍的汇总函数已经能够满足较为丰富的汇总功能,本节会为每个汇总给出范例,并对一些无法“见名知意”的函数进行具体的介绍。这里我们会统一对cars1的speed列进行操作。

心化汇总

 1#均值
2cars1 %>% 
3  summarise(speed.avg = mean(speed))
4## # A tibble: 1 x 1
5##   speed.avg
6##       <dbl>
7## 1      15.4
8#中位数
9cars1 %>% 
10  summarise(speed.median = median(speed))
11## # A tibble: 1 x 1
12##   speed.median
13##          <dbl>
14## 1           15

需要注意的是,R语言对缺失值是非常敏感的,也就说如果数据中有缺失值,那么汇总返回的平均值也会是缺失值。如果需要忽略缺失值,应该在mean函数中设置na.rm = T,也就是用以下语句:cars %>% summarise(speed.avg = mean(speed,na.rm = T)).

SQL代码:

<SQL> SELECT AVG(`speed`) AS `speed.avg`
FROM `cars1`

<SQL> SELECT MEDIAN(`speed`) AS `speed.median`

散化汇总

 1#标准差
2cars1 %>% 
3  summarise(speed.sd = sd(speed))
4## # A tibble: 1 x 1
5##   speed.sd
6##      <dbl>
7## 1     5.29
8#IQR
9cars1 %>% 
10  summarise(speed.IQR = IQR(speed))
11## # A tibble: 1 x 1
12##   speed.IQR
13##       <dbl>
14## 1         7
15#MAD
16cars1 %>% 
17  summarise(speed.MAD = mad(speed))
18## # A tibble: 1 x 1
19##   speed.MAD
20##       <dbl>
21## 1      5.93

IQR,四分位距,具体计算方法为IQR(x)= quantile(x, 3/4) - quantile(x, 1/4),也就是处于四分之三位置的数值减去处于四分之一位置的数值的差值。MAD,绝对中位差,指的是所有数值减去中位数的绝对值,然后相加的结果。

SQL代码如下:

<SQL> SELECT STDEV(`speed`) AS `speed.sd`
FROM `cars1`

<SQL> SELECT IQR(`speed`) AS `speed.IQR`
FROM `cars1`

<SQL> SELECT MAD(`speed`) AS `speed.MAD`
FROM `cars1`

围汇总

 1#最大值
2cars1 %>% 
3  summarise(speed.max = max(speed))
4## # A tibble: 1 x 1
5##   speed.max
6##       <dbl>
7## 1        25
8#最小值
9cars1 %>% 
10  summarise(speed.min = min(speed))
11## # A tibble: 1 x 1
12##   speed.min
13##       <dbl>
14## 1         4
15#50%分位数
16cars1 %>% 
17  summarise(speed.quantile = quantile(speed,0.5))
18## # A tibble: 1 x 1
19##   speed.quantile
20##            <dbl>
21## 1             15

注意分位数需要设定一个唯一值,对于汇总功能而言,一列只能汇总为一个值而不是多个值。另外,这里设置为0.5,那么就会求50%分位数,这个用户可以自定义选择。

SQL代码:

<SQL> SELECT MAX(`speed`) AS `speed.max`
FROM `cars1`

<SQL> SELECT MIN(`speed`) AS `speed.min`
FROM `cars1`

<SQL> SELECT QUANTILE(`speed`0.5) AS `speed.quantile`
FROM `cars1`

置汇总

 1#首行
2cars1 %>% 
3  summarise(speed.1st = first(speed))
4## # A tibble: 1 x 1
5##   speed.1st
6##       <dbl>
7## 1         4
8#末行
9cars1 %>% 
10  summarise(speed.last = last(speed))
11## # A tibble: 1 x 1
12##   speed.last
13##        <dbl>
14## 1         25
15#第3行
16cars1 %>% 
17  summarise(speed.nth = nth(speed,3))
18## # A tibble: 1 x 1
19##   speed.nth
20##       <dbl>
21## 1         7

算汇总

 1#首行
2cars1 %>% 
3  summarise(row.number = n())
4## # A tibble: 1 x 1
5##   row.number
6##        <int>
7## 1         50
8#检测了多少种速度
9cars1 %>% 
10  summarise(speed.n = n_distinct(speed))
11## # A tibble: 1 x 1
12##   speed.n
13##     <int>
14## 1      19

n()其实就是统计了表格的总行数,里面不需要放任何东西。但是如果想要知道试验中一共检测了多少种速度,那么就需要用到n_distinct函数,它会统计一共有多少个不同的速度。

SQL代码:

<SQL> SELECT COUNT() AS `row.number`
FROM `cars1`

<SQL> SELECT COUNT(DISTINCT `speed`) AS `speed.n`
FROM `cars1`

辑汇总

这个汇总方法的本质是,看看向量中是不是有任意一个能够满足要求,或者是否能够全部满足要求。例如,学校学生身高是不是全部的同学都超过了1米?有没有任何同学的身高达到了两米?需要注意的是,这个汇总会返回一个逻辑型结果,也就是TRUE或者FALSE。
下面还是用我们的数据集来举例:

 1#speed至少有一个是大于10的吗?
2cars1 %>%
3  summarise(any(speed > 10))
4## # A tibble: 1 x 1
5##   `any(speed > 10)`
6##   <lgl>            
7## 1 TRUE
8#speed中全部数值都大于10吗?
9cars1 %>%
10  summarise(all(speed > 10))
11## # A tibble: 1 x 1
12##   `all(speed > 10)`
13##   <lgl>            
14## 1 FALSE

SQL代码:

<SQL> SELECT ANY(`speed` > 10.0) AS `any(speed > 10)`
FROM `cars1`

<SQL> SELECT ALL(`speed` > 10.0) AS `all(speed > 10)`
FROM `cars1`


本章介绍了汇总的基本概念,并通过变换求值函数,实现各种不同的汇总操作。但凡是能够对向量进行计算并返回单一值的函数,都能够作为汇总的求值函数,我们甚至可以自定义求值函数,这为我们的工作提供了极大的便利。

往期精彩:

推荐 0
本文由 R语言中文社区 创作,采用 知识共享署名-相同方式共享 3.0 中国大陆许可协议 进行许可。
转载、引用前需联系作者,并署名作者且注明文章出处。
本站文章版权归原作者及原出处所有 。内容为作者个人观点, 并不代表本站赞同其观点和对其真实性负责。本站是一个个人学习交流的平台,并不用于任何商业目的,如果有任何问题,请及时联系我们,我们将根据著作权人的要求,立即更正或者删除有关内容。本站拥有对此声明的最终解释权。

0 个评论

要回复文章请先登录注册