R数据科学-第六章用dplyr处理关系数据

本文介绍了如何使用R中的dplyr库处理关系数据,包括合并连接、筛选连接和集合操作。通过nycflights13数据集,详细阐述了数据准备、键的概念以及各种连接类型,如内连接、外连接、左连接和全连接,并讨论了连接中的问题和解决策略。此外,还讲解了半连接和反连接在数据筛选中的应用。
摘要由CSDN通过智能技术生成

关系数据:存在于多个表的数据。

三类操作处理关系数据:

1.合并连接:向数据框中加入新变量,新变量的值为另一个数据框的匹配观测。

2.筛选连接:根据是否匹配另一个数据框的观测,筛选数据框的观测。

3.集合操作:将观测作为集合元素来处理。

一、数据准备

我们将研究一下nycflights13数据集的关系数据。nycflightsb13包含与flights相关的4个tibble:

airlines:可以根据航空公司的缩写查找到航空公司全名。

planes:给出了每架飞机的信息,通过tailnum进行标识。

weather:给出了纽约机场每小时的天气情况。

airports:给出了每个机场的信息,通过faa机场编码进行标识。

关系总结如下:

flights与planes通过tailnum相连。

flights与airlines通过carrier相连。

flights与airports通过origin和dest相连。

flights与weather通过origin以及year,month,day,hour相连。

二、键

用于连接每个数据表的变量称为键。键有两种类型:

1.主键:唯一标识其所在数据表中的观测。例如planes$tailnum是planes的一个主键,因为其可唯一标识其中的每架飞机。

2.外键:唯一标识另一个数据表中的观测。例如flights$tailnum是一个外键,因为其出现在flights表中,可以与唯一一架飞机相匹配。

一个变量既可以是主键也可以是外键,例如origin是weather表主键的一部分,也是airports的外键。

验证主键可以对主键进行count()操作,看看是否有n>1的记录。

library(tidyverse)
library(nycflights13)
planes %>% count(tailnum) %>% filter(n>1)

# A tibble: 0 x 2
# ... with 2 variables: tailnum <chr>, n <int>

有时数据表没有明确的主键:每一行都是一个观测,但没有一个变量组合能明确的标识它。例如flights数据表就是这样。如果一张表没有主键,需要使用mutate函数和row_number函数为表加上一个主键,这种主键称为代理键

三、合并连接

合并连接可以将两个表格中的变量组合起来,先通过两个表格的键匹配观测,然后将一个表格中的变量复制到另一个表格中。

1.实例

left_join函数通过carrier属性连接两个数据框:

flights2<-flights %>% select(year:day,hour,origin,dest,tailnum,carrier)
flights2 %>% select(-origin,-dest) %>% left_join(airlines,by='carrier')
# A tibble: 336,776 x 7
    year month   day  hour tailnum carrier name        
   <int> <int> <int> <dbl> <chr>   <chr>   <chr>       
 1  2013     1     1     5 N14228  UA      United Air ~
 2  2013     1     1     5 N24211  UA      United Air ~
 3  2013     1     1     5 N619AA  AA      American Ai~
 4  2013     1     1     5 N804JB  B6      JetBlue Air~
 5  2013     1     1     6 N668DN  DL      Delta Air L~
 6  2013     1     1     5 N39463  UA      United Air ~
 7  2013     1     1     6 N516JB  B6      JetBlue Air~
 8  2013     1     1     6 N829AS  EV      ExpressJet ~
 9  2013     1     1     6 N593JB  B6      JetBlue Air~
10  2013     1     1     6 N3ALAA  AA      American Ai~
# ... with 336,766 more rows
>

使用mutate函数和R取子集操作也可以达到同样的效果:

flights2 %>% select(-origin,-dest) %>% mutate(name=airlines$name[match(carrier,airlines$carrier)])
# A tibble: 336,776 x 7
    year month   day  hour tailnum carrier name    
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值