关系数据:存在于多个表的数据。
三类操作处理关系数据:
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