筆記說(shuō)明
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ù)集的操作是很常見(jiàn)的。對(duì)兩個(gè)數(shù)據(jù)集的觀測(cè)根據(jù)共同變量進(jìn)行橫向合并的操作就是“join”,匹配用的共同變量叫做“key”。對(duì)2個(gè)數(shù)據(jù)集的key變量匹配后沒(méi)有匹配上的觀測(cè)是被剔除還是用缺失值填補(bǔ)則取決于具體使用哪個(gè)類(lèi)型的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稱(chēng)為“Mutating Join”,其結(jié)果數(shù)據(jù)集中會(huì)有2個(gè)數(shù)據(jù)集的所有變量。
后兩種join稱(chēng)為“Filtering Join”,filtering join根據(jù)前一個(gè)數(shù)據(jù)集中的觀測(cè)在后一個(gè)數(shù)據(jù)集是否有匹配觀測(cè)來(lái)對(duì)前一個(gè)數(shù)據(jù)集的觀測(cè)進(jìn)行篩選。
不同的join函數(shù)的用法類(lèi)似,其中:
-
x,y是進(jìn)行Join操作的兩個(gè)數(shù)據(jù)集 -
by=指定匹配變量,如果匹配變量在兩個(gè)數(shù)據(jù)集中名字不同,可以用by = c("a" = "b")指定匹配x的a變量和y的b變量;另外可以用by = c("col1","col2",...)來(lái)指定多個(gè)匹配變量 -
copy選項(xiàng):如果x,y不是來(lái)自同一個(gè)數(shù)據(jù)源,將copy選項(xiàng)設(shè)為T(mén)RUE會(huì)先把y拷貝一份到x的數(shù)據(jù)源中。對(duì)我來(lái)說(shuō)一般用不到。。 -
suffix = c(".x", ".y"):當(dāng)x,y中存在非匹配變量的同名變量時(shí),suffix=中指定的后綴會(huì)加到結(jié)果數(shù)據(jù)集對(duì)應(yīng)的變量名后面來(lái)區(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è)來(lái)對(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è)來(lái)對(duì)前一個(gè)數(shù)據(jù)集的觀測(cè)進(jìn)行篩選,只保留沒(méi)有匹配的觀測(cè)。