筆記說明
dplyr包是一個(gè)用于數(shù)據(jù)清理的高效r包沈矿,也是tidyverse
的核心包之一零院。
之前的筆記:
用dplyr包進(jìn)行數(shù)據(jù)清理-filter()和select()
用dplyr包進(jìn)行數(shù)據(jù)清理-group_by()和summarise()
用dplyr包進(jìn)行數(shù)據(jù)清理-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包中用于兩個(gè)數(shù)據(jù)集橫向合并的各種*_join()
函數(shù)
推薦閱讀:
https://dplyr.tidyverse.org/articles/two-table.html
https://www.rdocumentation.org/packages/dplyr/versions/0.7.8/topics/join
join介紹
數(shù)據(jù)清理時(shí)涯竟,把2個(gè)或多個(gè)數(shù)據(jù)集的信息整理到1個(gè)數(shù)據(jù)集的操作是很常見的啸澡。對(duì)兩個(gè)數(shù)據(jù)集的觀測(cè)根據(jù)共同變量進(jìn)行橫向合并的操作就是“join”飞崖,匹配用的共同變量叫做“key”丹弱。對(duì)2個(gè)數(shù)據(jù)集的key變量匹配后沒有匹配上的觀測(cè)是被剔除還是用缺失值填補(bǔ)則取決于具體使用哪個(gè)類型的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”,其結(jié)果數(shù)據(jù)集中會(huì)有2個(gè)數(shù)據(jù)集的所有變量躲胳。
后兩種join稱為“Filtering Join”蜓洪,filtering join根據(jù)前一個(gè)數(shù)據(jù)集中的觀測(cè)在后一個(gè)數(shù)據(jù)集是否有匹配觀測(cè)來對(duì)前一個(gè)數(shù)據(jù)集的觀測(cè)進(jìn)行篩選。
不同的join函數(shù)的用法類似坯苹,其中:
-
x
隆檀,y
是進(jìn)行Join操作的兩個(gè)數(shù)據(jù)集 -
by=
指定匹配變量,如果匹配變量在兩個(gè)數(shù)據(jù)集中名字不同粹湃,可以用by = c("a" = "b")
指定匹配x的a變量和y的b變量恐仑;另外可以用by = c("col1","col2",...)
來指定多個(gè)匹配變量 -
copy
選項(xiàng):如果x,y不是來自同一個(gè)數(shù)據(jù)源,將copy選項(xiàng)設(shè)為TRUE會(huì)先把y拷貝一份到x的數(shù)據(jù)源中为鳄。對(duì)我來說一般用不到裳仆。。 -
suffix = c(".x", ".y")
:當(dāng)x,y中存在非匹配變量的同名變量時(shí)孤钦,suffix=
中指定的后綴會(huì)加到結(jié)果數(shù)據(jù)集對(duì)應(yīng)的變量名后面來區(qū)分同名變量歧斟。
下面就是具體的各個(gè)join的演示:
準(zhǔn)備工作
加載dplyr包
library(dplyr)
數(shù)據(jù)準(zhǔn)備
構(gòu)造兩個(gè)數(shù)據(jù)集x,y
# 數(shù)據(jù)準(zhǔn)備
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()
將兩個(gè)數(shù)據(jù)集的所有觀測(cè)都保留纯丸,缺失值用NA
填補(bǔ)。
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()
只保留兩個(gè)數(shù)據(jù)集中都有的觀測(cè)静袖。
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()
保留第一個(gè)數(shù)據(jù)集的所有觀測(cè)觉鼻,第二個(gè)數(shù)據(jù)集中未能匹配的觀測(cè)的對(duì)應(yīng)變量值用NA
填補(bǔ)。
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()
保留第二個(gè)數(shù)據(jù)集的所有觀測(cè)队橙,第一個(gè)數(shù)據(jù)集中未能匹配的觀測(cè)的對(duì)應(yīng)變量值用NA
填補(bǔ)坠陈。
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()
根據(jù)前一個(gè)數(shù)據(jù)集中的觀測(cè)在后一個(gè)數(shù)據(jù)集是否有匹配觀測(cè)來對(duì)前一個(gè)數(shù)據(jù)集的觀測(cè)進(jìn)行篩選,只保留有匹配的觀測(cè)捐康。
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()
根據(jù)前一個(gè)數(shù)據(jù)集中的觀測(cè)在后一個(gè)數(shù)據(jù)集是否有匹配觀測(cè)來對(duì)前一個(gè)數(shù)據(jù)集的觀測(cè)進(jìn)行篩選畅姊,只保留沒有匹配的觀測(cè)。