library(tidyverse)
library(nycflights13)
airlines #公司缩写码——公司名称
airports #faa机场编码——机场信息(名称、地理位置)
planes #tailnum飞机标识码——飞机信息
weather #纽约机场天气状况
1. 键
1.1 主键与外键
两张存在一定联系的表格,比如一张表格是“姓名、学号、专业、班级”,另一张表格是“学号、数学成绩、物理成绩、英语成绩”,变量(列名)“学号”可以称为“键”。在表1中“学号”叫做“主键”,在表2中就叫做“外键”;反之亦然。并且,键的选取要没有歧义,它在一个表中一个实际的值只能标识一行记录。
1.2 验证主键正确性
> planes %>% count(tailnum) %>% filter(n>1)
# A tibble: 0 x 2
# ... with 2 variables: tailnum <chr>, n <int>
2. 合并连接
举个栗子
> flights2 <- flights %>% select(year:day,hour,origin,dest,tailnum,carrier)
> flights2 %>% left_join(airlines,by = "carrier") #注意left_join()的用法
# A tibble: 336,776 x 9
year month day hour origin dest tailnum carrier name
<int> <int> <int> <dbl> <chr> <chr> <chr> <chr> <chr>
1 2013 1 1 5 EWR IAH N14228 UA United Air Lines Inc.
2 2013 1 1 5 LGA IAH N24211 UA United Air Lines Inc.
3 2013 1 1 5 JFK MIA N619AA AA American Airlines Inc.
2.1 内连接
只要两个观测的键是相等的,则形成匹配关系
x <- tribble(
~key,~val_x,
1,"x1",
2,"x2",
3,"x3"
)
y <- tribble(
~key,~val_y,
1,"y1",
2,"y2",
4,"y3"
)
> x %>% inner_join(y,by="key")
# A tibble: 2 x 3
key val_x val_y
<dbl> <chr> <chr>
1 1 x1 y1
2 2 x2 y2
2.2 外连接
外连接保留至少存在于一个表中的观测
- 左连接:保留x中的全部观测
- 右连接:保留y中的全部观测
- 全连接:保留x和y中的全部观测
> x %>% left_join(y,by="key")
# A tibble: 3 x 3
key val_x val_y
<dbl> <chr> <chr>
1 1 x1 y1
2 2 x2 y2
3 3 x3 NA
> x %>% right_join(y,by = "key")
# A tibble: 3 x 3
key val_x val_y
<dbl> <chr> <chr>
1 1 x1 y1
2 2 x2 y2
3 4 NA y3
> x %>% full_join(y,by = "key")
# A tibble: 4 x 3
key val_x val_y
<dbl> <chr> <chr>
1 1 x1 y1
2 2 x2 y2
3 3 x3 NA
4 4 NA y3
2.3 重复键
> x <- tribble(
+ ~key,~val_x,
+ 1,"x1",
+ 1,"x2",
+ 2,"x3",
+ 2,"x4"
+ )
> y <- tribble(
+ ~key,~val_y,
+ 1,"y1",
+ 2,"y2"
+ )
> left_join(x,y,by="key")
# A tibble: 4 x 3
key val_x val_y
<dbl> <chr> <chr>
1 1 x1 y1
2 1 x2 y1
3 2 x3 y2
4 2 x4 y2
> left_join(y,x,by = "key")
# A tibble: 4 x 3
key val_y val_x
<dbl> <chr> <chr>
1 1 y1 x1
2 1 y1 x2
3 2 y2 x3
4 2 y2 x4
2.4 定义键列
- by=NULL:所有共有变量作为键
- by="str":共有变量str作为键
- by=c("str_x"="str_y"):x表中的str_x变量和y表中的str_y变量作为主/外键
flights2 %>% left_join(weather)
flights2 %>% left_join(planes,by = "tailnum")
flights2 %>% left_join(airports,c("dest"="faa"))
网友评论