所涉及的函数
-
Mutating Joins:
inner_join()
,left_join()
,right_join()
,full_join()
-
Filtering Joins:
semi_join()
,anti_join()
深入了解学习的内容
- 《R for data science》
- Relational Data
- gganimate 作者用来制作动图的包
数据类型
x <- tribble(
~key, ~val_x,
1, "x1",
2, "x2",
3, "x3")
y <- tribble(
~key, ~val_y,
1, "y1",
2, "y2",
4, "y3")
y1 <- tribble(
~key, ~val_y,
1, "y1",
2, "y2",
4, "y4",
2, "y5")
![](https://img.haomeiwen.com/i6223615/1d6521b9d5cf982b.png)
合并连接
内连接
inner_join 函数
- 内连接的结果是一个新数据框,其中包含键、 x 值和 y 值。我们使用 by 参数告诉 dplyr 哪个变量是键:
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
![](https://img.haomeiwen.com/i6223615/fa9a925e81af7f40.gif)
外连接
- 内连接保留同时存在于两个表中的观测, 外连接则保留至少存在于一个表中的观测。外连
接有 3 种类型。
• 左连接:保留 x 中的所有观测。
• 右连接:保留 y 中的所有观测
• 全连接:保留 x 和 y 中的所有观测。
left_join函数
- 左连接:保留 x 中的所有观测。
> left_join(x, 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
![](https://img.haomeiwen.com/i6223615/e25c62a2e9d420f2.gif)
如果x中的key变量,在y中有多个同样的key,那么所有的结合可能都会罗列出来
> left_join(x, y1, by = "key")
# A tibble: 4 x 3
key val_x val_y
<dbl> <chr> <chr>
1 1 x1 y1
2 2 x2 y2
3 2 x2 y5
4 3 x3 NA
![](https://img.haomeiwen.com/i6223615/3ff78293401da0ad.gif)
right_join函数
- 右连接:保留 y 中的所有观测
> right_join(x, 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
![](https://img.haomeiwen.com/i6223615/0007ba53aaa9242a.gif)
full_join函数
- 全连接:保留 x 和 y 中的所有观测。
> full_join(x, 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
![](https://img.haomeiwen.com/i6223615/7dacc11730c73e2b.gif)
使用维恩图表示不同类型连接方式
![](https://img.haomeiwen.com/i6223615/4da48e000e55719b.png)
dplyr中这些连接函数对应基础函数merge中的功能表
![](https://img.haomeiwen.com/i6223615/32d7c2a04f48ce7a.png)
dplyr这几种函数的来源SQL中对应的功能
![](https://img.haomeiwen.com/i6223615/b51302ec1604e768.png)
筛选连接
- 筛选连接匹配观测的方式与合并连接相同,但前者影响的是观测,而不是变量。筛选连接
有两种类型。
• semi_join(x, y): 保留 x 表中与 y 表中的观测相匹配的所有观测。
• anti_join(x, y): 丢弃 x 表中与 y 表中的观测相匹配的所有观测。
semi_join函数
- 保留 x 表中与 y 表中的观测相匹配的所有观测
> semi_join(x, y, by = "key")
# A tibble: 2 x 2
key val_x
<dbl> <chr>
1 1 x1
2 2 x2
![](https://img.haomeiwen.com/i6223615/adb1c0105167da05.gif)
anti_join函数
- 丢弃 x 表中与 y 表中的观测相匹配的所有观测。
> anti_join(x, y, by = "key")
# A tibble: 1 x 2
key val_x
<dbl> <chr>
1 3 x3
![](https://img.haomeiwen.com/i6223615/07a21465bf376d4d.gif)
参考博文:
图中gif文件来源,tiwtter上逛#rstat(类似微博话题)专题时看到的大神的操作
https://github.com/gadenbuie/tidy-animated-verbs#relational-data
![](https://img.haomeiwen.com/i6223615/40349d641f593558.png)
参考书籍
英文版:《R for data science》
中文版:《R数据科学》
网友评论