笔记说明
dplyr包是一个用于数据清理的高效r包,也是tidyverse
的核心包之一。
之前的笔记:
用dplyr包进行数据清理-filter()和select()
用dplyr包进行数据清理-group_by()和summarise()
用dplyr包进行数据清理-mutate()和arrange()
介绍了dplyr包的常用操作包括:
mutate()
adds new variables that are functions of existing variables
select()
picks variables based on their names.
filter()
picks cases based on their values.
summarise()
reduces multiple values down to a single summary.
arrange()
changes the ordering of the rows.
group_by()
allows you to perform any operation “by group”
本次笔记介绍dplyr包中用于两个数据集横向合并的各种*_join()
函数
推荐阅读:
https://dplyr.tidyverse.org/articles/two-table.html
https://www.rdocumentation.org/packages/dplyr/versions/0.7.8/topics/join
join介绍
数据清理时,把2个或多个数据集的信息整理到1个数据集的操作是很常见的。对两个数据集的观测根据共同变量进行横向合并的操作就是“join”,匹配用的共同变量叫做“key”。对2个数据集的key变量匹配后没有匹配上的观测是被剔除还是用缺失值填补则取决于具体使用哪个类型的join操作,常用的join包括:
inner_join(x, y, by = NULL, copy = FALSE, suffix = c(".x", ".y"),
...)
left_join(x, y, by = NULL, copy = FALSE, suffix = c(".x", ".y"), ...)
right_join(x, y, by = NULL, copy = FALSE, suffix = c(".x", ".y"),
...)
full_join(x, y, by = NULL, copy = FALSE, suffix = c(".x", ".y"), ...)
semi_join(x, y, by = NULL, copy = FALSE, ...)
anti_join(x, y, by = NULL, copy = FALSE, ...)
前四种join称为“Mutating Join”,其结果数据集中会有2个数据集的所有变量。
后两种join称为“Filtering Join”,filtering join根据前一个数据集中的观测在后一个数据集是否有匹配观测来对前一个数据集的观测进行筛选。
不同的join函数的用法类似,其中:
-
x
,y
是进行Join操作的两个数据集 -
by=
指定匹配变量,如果匹配变量在两个数据集中名字不同,可以用by = c("a" = "b")
指定匹配x的a变量和y的b变量;另外可以用by = c("col1","col2",...)
来指定多个匹配变量 -
copy
选项:如果x,y不是来自同一个数据源,将copy选项设为TRUE会先把y拷贝一份到x的数据源中。对我来说一般用不到。。 -
suffix = c(".x", ".y")
:当x,y中存在非匹配变量的同名变量时,suffix=
中指定的后缀会加到结果数据集对应的变量名后面来区分同名变量。
下面就是具体的各个join的演示:
准备工作
加载dplyr包
library(dplyr)
数据准备
构造两个数据集x,y
# 数据准备
x <- tibble(id = c(1,2,3), a = c('a','b','c'))
y <- tibble(id = c(2,3,4), b = c('x','y','z'))
x:
## # A tibble: 3 x 2
## id a
## <dbl> <chr>
## 1 1 a
## 2 2 b
## 3 3 c
y:
## # A tibble: 3 x 2
## id b
## <dbl> <chr>
## 1 2 x
## 2 3 y
## 3 4 z
full_join
# full_join
x_y_full <- x %>%
full_join(y, by = c("id"))
## # A tibble: 4 x 3
## id a b
## <dbl> <chr> <chr>
## 1 1 a NA
## 2 2 b x
## 3 3 c y
## 4 4 NA z
full_join()
将两个数据集的所有观测都保留,缺失值用NA
填补。
inner_join
# inner_join
x_y_inner <- x %>%
inner_join(y, by = c("id"))
## # A tibble: 2 x 3
## id a b
## <dbl> <chr> <chr>
## 1 2 b x
## 2 3 c y
inner_join()
只保留两个数据集中都有的观测。
left_join
# left_join
x_y_left <- x %>%
left_join(y, by = c("id"))
## # A tibble: 3 x 3
## id a b
## <dbl> <chr> <chr>
## 1 1 a NA
## 2 2 b x
## 3 3 c y
left_join()
保留第一个数据集的所有观测,第二个数据集中未能匹配的观测的对应变量值用NA
填补。
right_join
# right_join
x_y_right <- x %>%
right_join(y, by = c("id"))
## # A tibble: 3 x 3
## id a b
## <dbl> <chr> <chr>
## 1 2 b x
## 2 3 c y
## 3 4 NA z
right_join()
保留第二个数据集的所有观测,第一个数据集中未能匹配的观测的对应变量值用NA
填补。
semi_join
# semi_join
x_semi <- x %>%
semi_join(y, by = c("id"))
## # A tibble: 2 x 2
## id a
## <dbl> <chr>
## 1 2 b
## 2 3 c
seme_join()
根据前一个数据集中的观测在后一个数据集是否有匹配观测来对前一个数据集的观测进行筛选,只保留有匹配的观测。
anti_join
# anti_join
x_anti <- x %>%
anti_join(y, by = c("id"))
## # A tibble: 1 x 2
## id a
## <dbl> <chr>
## 1 1 a
anti_join()
根据前一个数据集中的观测在后一个数据集是否有匹配观测来对前一个数据集的观测进行筛选,只保留没有匹配的观测。