用dplyr处理关系型数据

背景

很多情况下,数据分析需要处理多个表。我们需要联合多个表来分析数据,回答问题。
今天,我们来看一下如何用dplyr来操作多个表。

如果你学过sql语言,那这一节对你来说会很熟悉

基本概念

当我们把两个表连接在一起时,需要用变量来做链接。这个用来连接两个表的变量被称为键。
常见的键有两种:

1. 主键

所谓的主键,就是能代表本表中唯一一个观测值的变量。
比如说,过两天就高考了,我们把所有高考学生的信息组成一个表。
在这个表里,每个学生都有一个考号,这个考号是唯一的,不可能重复。那我们可以把考号设为这个表的主键。

2.外键

外键能标示出另一个表中的唯一观测值。
接着上一个例子,每个学生除了考号之外,还有个人信息,个人信息里面还有身份证号。
如果还有另外一张表,记录的是全国人的信息。那可以通过这个身份证号找到在全国人表里面的这个考生。
在这种情况下,身份证号就是一个外键。

当然,身份证号这个变量,可以既做主键又做外键,因为它能识别出本表和另外一张表中的唯一观测值。

如何确定是不是主键?

有时,我们拿到一个数据表,也不是特别清楚一个值是不是有重复。这个时候,用count函数数一下到底有多少观测值。

再用之前的nycflights13这个数据集为例,里面有一张表,叫planes,记录了飞机的信息。我们想确认一下tailnum这个变量适不适合作为这张表的主键。

planes %>% count(tailnum) %>% filter(n>1)

结果没有数据,说明没有重复的记录,所以tailnum可以作为主键.

没有主键怎么办?

如果没有主键,可以考虑加上一个代号。
比如:

planes %>% mutate(id=row_number())

这样就多了一列id,这个id是行号,能暂时替代主键。

对两表进行操作

Inner Join内连

inner join最简单,只要是值相等,就会连接起来,但是没有配成对的行不会出现在结果中。换句话说,内连的结果是两个数据集的交集。
比如,我们新建两个数据集。

x<-tribble(~key,~val_x,1,"x1",2,"x2",3,"x3")
y<-tribble(~key,~val_y,1,"y1",2,"y2",4,"y3")

x中,key是主键,它在y中的外键是key。
当我们使用inner_join的时候,x中的key就会和y中的key进行匹配,最后如下:
请添加图片描述

x %>% inner_join(y,by="key")

在这里插入图片描述

Outer Joins外连

内连会取的两个数据集的交集,而外链则会保留至少一个数据表的数据。总共可以分三种外连方式。

  1. left_join:会把左表的数据都留下来(在例子中,就是把x数据集中的数据都保留)
  2. right_join:会把右表的数据都留下来(在例子中,就是把y数据集中的数据都保留)
  3. full_join:会把两个表的所有数据都保留下来。
    如果没有匹配的数值,则自动填充NA。
    如下:
    请添加图片描述
    如果用韦恩图的方式来表示,各种连接,则是下面的样子:
    请添加图片描述

在使用函数的时候,我们使用了by="key"来表示是用key这个变量来连接的。实际上,如果没有这一部分,R会把两个表中相同的变量进行匹配,所以在命名变量名的时候,还是要注意的。

如果相同的变量在不同的表里有不同的变量名,那么可以用by=c(“变量名1”=“变量名2”)的方式进行。

filtering joins

筛选连接,顾名思义,就是用连接的方式进行筛选。
常用的用两种:

  1. semi_join(x,y)保留x中所有和y有匹配值的观测值
  2. anti_join(x,y)把x中所有能和y有匹配的值扔掉。

当然,在筛选的时候,我们用filter函数也可以,但是如果你想筛选多个变量,那filter就比较麻烦。可以考虑用semi_join这些函数。

  • 9
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值