用dplyr包進(jìn)行數(shù)據(jù)清理-數(shù)據(jù)集的橫向合并

筆記說(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è)。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容