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

2019 年 3 月 16 日 R语言中文社区

作者:黄天元,复旦大学博士在读,目前研究涉及文本挖掘、社交网络分析和机器学习等。希望与大家分享学习经验,推广并加深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


汇总函数示例

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


心化汇总

 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`



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



往期精彩:


公众号后台回复关键字即可学习

回复 爬虫            爬虫三大案例实战
回复 Python       1小时破冰入门
回复 数据挖掘     R语言入门及数据挖掘
回复 人工智能     三个月入门人工智能
回复 数据分析师  数据分析师成长之路 
回复 机器学习     机器学习的商业应用
回复 数据科学     数据科学实战
回复 常用算法     常用数据挖掘算法

给我【好看】

你也越好看!

登录查看更多
0

相关内容

【2020新书】实战R语言4,323页pdf
专知会员服务
100+阅读 · 2020年7月1日
【实用书】学习用Python编写代码进行数据分析,103页pdf
专知会员服务
194+阅读 · 2020年6月29日
【干货书】R语言书: 编程和统计的第一课程,
专知会员服务
111+阅读 · 2020年5月9日
Python分布式计算,171页pdf,Distributed Computing with Python
专知会员服务
107+阅读 · 2020年5月3日
【干货书】流畅Python,766页pdf,中英文版
专知会员服务
225+阅读 · 2020年3月22日
【经典书】Python数据数据分析第二版,541页pdf
专知会员服务
193+阅读 · 2020年3月12日
缺失数据统计分析,第三版,462页pdf
专知会员服务
108+阅读 · 2020年2月28日
盘一盘 Python 系列 8 - Sklearn
平均机器
5+阅读 · 2019年5月30日
一文看懂怎么用 Python 做数据分析
大数据技术
24+阅读 · 2019年5月5日
R语言自然语言处理:文本分类
R语言中文社区
7+阅读 · 2019年4月27日
R语言自然语言处理:情感分析
R语言中文社区
16+阅读 · 2019年4月16日
R语言自然语言处理:关键词提取与文本摘要(TextRank)
R语言中文社区
4+阅读 · 2019年3月18日
R语言自然语言处理:词性标注与命名实体识别
R语言中文社区
7+阅读 · 2019年3月5日
文本分析与可视化
Python程序员
9+阅读 · 2019年2月28日
R语言数据挖掘利器:Rattle包
R语言中文社区
21+阅读 · 2018年11月17日
Python3爬虫之入门和正则表达式
全球人工智能
7+阅读 · 2017年10月9日
Arxiv
15+阅读 · 2020年2月6日
Few-shot Learning: A Survey
Arxiv
362+阅读 · 2019年4月10日
Arxiv
3+阅读 · 2018年12月18日
VIP会员
相关VIP内容
【2020新书】实战R语言4,323页pdf
专知会员服务
100+阅读 · 2020年7月1日
【实用书】学习用Python编写代码进行数据分析,103页pdf
专知会员服务
194+阅读 · 2020年6月29日
【干货书】R语言书: 编程和统计的第一课程,
专知会员服务
111+阅读 · 2020年5月9日
Python分布式计算,171页pdf,Distributed Computing with Python
专知会员服务
107+阅读 · 2020年5月3日
【干货书】流畅Python,766页pdf,中英文版
专知会员服务
225+阅读 · 2020年3月22日
【经典书】Python数据数据分析第二版,541页pdf
专知会员服务
193+阅读 · 2020年3月12日
缺失数据统计分析,第三版,462页pdf
专知会员服务
108+阅读 · 2020年2月28日
相关资讯
盘一盘 Python 系列 8 - Sklearn
平均机器
5+阅读 · 2019年5月30日
一文看懂怎么用 Python 做数据分析
大数据技术
24+阅读 · 2019年5月5日
R语言自然语言处理:文本分类
R语言中文社区
7+阅读 · 2019年4月27日
R语言自然语言处理:情感分析
R语言中文社区
16+阅读 · 2019年4月16日
R语言自然语言处理:关键词提取与文本摘要(TextRank)
R语言中文社区
4+阅读 · 2019年3月18日
R语言自然语言处理:词性标注与命名实体识别
R语言中文社区
7+阅读 · 2019年3月5日
文本分析与可视化
Python程序员
9+阅读 · 2019年2月28日
R语言数据挖掘利器:Rattle包
R语言中文社区
21+阅读 · 2018年11月17日
Python3爬虫之入门和正则表达式
全球人工智能
7+阅读 · 2017年10月9日
Top
微信扫码咨询专知VIP会员