作者:黄天元,复旦大学博士在读,目前研究涉及文本挖掘、社交网络分析和机器学习等。希望与大家分享学习经验,推广并加深R语言在业界的应用。
邮箱:huang.tian-yuan@qq.com
本章将会介绍如何在R中完成数据表的连接操作。首先要明确一个问题:为什么要进行连接?本质上来说,连接就是按照一定的对应规则,把两个表格合并为一个表格的操作。举个例子:比如我们一张表格中有乐队的歌手名字和他们所属的乐队,另一张表格有歌手的名字和他们擅长的乐器类型。因为两张表格都含有歌手的名字,而歌手的名字也是唯一的(在数据库理论框架中,这个属性被称为主键),即不存在一张表格会重复出现同一个歌手的名字。这个时候,我们就希望把两张表格合并起来,做一张包含歌手名字、所属乐队、擅长乐器的大表格。通过连接,我们能够把众多表格的数据合并起来,从而让孤立的数据能够联系在一起。
本章会采用较为简单的数据集进行实现,下面我们会参考dplyr的帮助文档举例,前期准备如下:
1library(tidyverse)
2band_members
3# # A tibble: 3 x 2
5# name band
6# <chr> <chr>
7# 1 Mick Stones
8# 2 John Beatles
9# 3 Paul Beatles
10
11band_instruments
12# # A tibble: 3 x 2
14# name plays
15# <chr> <chr>
16# 1 John guitar
17# 2 Paul bass
18# 3 Keith guitar
19
20band_instruments2
21# # A tibble: 3 x 2
23# artist plays
24# <chr> <chr>
25# 1 John guitar
26# 2 Paul bass
27# 3 Keith guitar
观察表格,我们可以知道,band_members包含了歌手名称和乐队信息,band_instruments包含歌手名称和乐器信息,band_instruments2与band_instrument包含的信息一样,但是歌手名称的列名称由name变化为artist。
连接分为很多种,包括内连接、全链接、左连接、右连接等。我们先介绍一些基础的逻辑,先看下面这张图:
下面我们逐个讲解这些连接的概念。 首先我们来讲内连接,又叫做自然连接。还是歌手、乐队、乐器的例子,比如我们的A表格中有歌手名称和乐队的信息,B表格中有歌手名称和擅长乐器的信息。另外,我们发现两张表格中,A表格包含的歌手信息和B表格不同,有的歌手只有A表格有,B表格就没有;有的歌手只有B表格有,但是A表格没有。但是我们还是希望把A表格和B表格连接起来,形成一个大表格C。采用内连接的话,就会把A表格和B表格都有的歌手提取出来(也就是取了一个交集),然后对两个表格的列进行连接。
下面介绍左连接和右连接。如果是A表格左连接B表格的话,那么就是A表格的歌手肯定全部保留,如果在A里面有的歌手,在B中找不到,那么就需要填充缺失值,一切以A表格为主。理解了左连接,右连接就非常简单了,它其实就是左连接的逆运算,也就是说A右连接B,实际就是B左连接A。就是这么简单。 最后我们讲一下全连接。全连接就是A表格B表格的歌手我们统统都保留,但是如果A表格有的歌手B表格没有,那么在B表格的列中就需要填充缺失值;同理,如果B表格的歌手A没有,那么A表格带来的列也需要填充缺失值。
如果还是不理解,可以看一下下面这一张图片。