2015-12-02 28 views
1

我已經使用以下命令在R中合併了兩個數據框。如何在合併兩個文件時識別失敗案例?

tmp <- merge(df_a, df_b, by.x = c('colA'), by.y = c('colB')) 

令我驚訝的是,超過50%的行未能合併,這不是預期的。我想根據給定的條件確定未能合併的案例(從df_adf_b)。在R中有沒有可能的方法,或者我們只需要執行命令行操作?

編輯: 這可以使用該解決方案的一個實現在this問題,並且可以使用加入功能獲得許多其他信息!

+0

如果有我是'df_b'中沒有缺失值的列,您可以在merge合併調用中設置'all.x = TRUE',然後檢查結果的'df_b'列中的'NA'。你也可以在** dplyr **包中找到'anti_join'和'semi_join'函數。 –

+3

或只使用'all = TRUE'選項。 – agstudy

+0

是的,'merge'中的'all = TRUE'參數就是你需要的。它會將所有不匹配的值作爲「NA」返回,然後可以用'is.na'搜索。查看'?merge'獲取更多細節。 – giraffehere

回答

1

您可以使用all=TRUE

df_a <- data.frame(colA=2*(1:10),datA=1:10) 
df_b <- data.frame(colB=3*(1:10),datB=1:10) 

tmp <- merge(df_a, df_b, by.x = c('colA'), by.y = c('colB')) 
# colA datA datB 
# 1 6 3 2 
# 2 12 6 4 
# 3 18 9 6 

tmp1 <- merge(df_a, df_b, by.x = c('colA'), by.y = c('colB'),all=TRUE) 
# colA datA datB 
# 1  2 1 NA 
# 2  3 NA 1 
# 3  4 2 NA 
# 4  6 3 2 
# 5  8 4 NA 
# 6  9 NA 3 
# 7 10 5 NA 
# 8 12 6 4 
# 9 14 7 NA 
# 10 15 NA 5 
# 11 16 8 NA 
# 12 18 9 6 
# 13 20 10 NA 
# 14 21 NA 7 
# 15 24 NA 8 
# 16 27 NA 9 
# 17 30 NA 10 

或者你也可以檢查直接使用%in%

df_a[!df_a$colA %in% df_b$colB,] 
# colA datA 
# 1  2 1 
# 2  4 2 
# 4  8 4 
# 5 10 5 
# 7 14 7 
# 8 16 8 
# 10 20 10 

df_b[!df_b$colB %in% df_a$colA,] 
# colB datB 
# 1  3 1 
# 3  9 3 
# 5 15 5 
# 7 21 7 
# 8 24 8 
# 9 27 9 
# 10 30 10 
+0

感謝您的建議。對我感到羞恥,完全忘了'%in%'操作符。 – Prradep

2

dplyr封裝具有anti_join功能專爲這項任務:

library(dplyr) 

# two sample DFs, each one with an unmatched row 
df_a <- data_frame(row=1:3, colA=c('a', 'b', 'c')) 
df_b <- data_frame(row=1:3, colA=c('a', 'b', 'd')) 

anti_join(df_a, df_b) 
#  row colA 
# (int) (chr) 
# 1  3  c 

anti_join(df_b, df_a) 
#  row colA 
# (int) (chr) 
# 1  3  d 
+0

感謝@Matthew對'dplyr'的想法。 – Prradep