我已經使用以下命令在R中合併了兩個數據框。如何在合併兩個文件時識別失敗案例?
tmp <- merge(df_a, df_b, by.x = c('colA'), by.y = c('colB'))
令我驚訝的是,超過50%的行未能合併,這不是預期的。我想根據給定的條件確定未能合併的案例(從df_a
,df_b
)。在R中有沒有可能的方法,或者我們只需要執行命令行操作?
編輯: 這可以使用該解決方案的一個實現在this問題,並且可以使用加入功能獲得許多其他信息!
我已經使用以下命令在R中合併了兩個數據框。如何在合併兩個文件時識別失敗案例?
tmp <- merge(df_a, df_b, by.x = c('colA'), by.y = c('colB'))
令我驚訝的是,超過50%的行未能合併,這不是預期的。我想根據給定的條件確定未能合併的案例(從df_a
,df_b
)。在R中有沒有可能的方法,或者我們只需要執行命令行操作?
編輯: 這可以使用該解決方案的一個實現在this問題,並且可以使用加入功能獲得許多其他信息!
您可以使用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
感謝您的建議。對我感到羞恥,完全忘了'%in%'操作符。 – Prradep
的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
感謝@Matthew對'dplyr'的想法。 – Prradep
如果有我是'df_b'中沒有缺失值的列,您可以在merge合併調用中設置'all.x = TRUE',然後檢查結果的'df_b'列中的'NA'。你也可以在** dplyr **包中找到'anti_join'和'semi_join'函數。 –
或只使用'all = TRUE'選項。 – agstudy
是的,'merge'中的'all = TRUE'參數就是你需要的。它會將所有不匹配的值作爲「NA」返回,然後可以用'is.na'搜索。查看'?merge'獲取更多細節。 – giraffehere