我使用以下命令在R中合并了两个数据帧。
tmp <- merge(df_a, df_b, by.x = c('colA'), by.y = c('colB'))
令我惊讶的是,超过50%的行未能合并,这是不可预期的。我想根据给定的条件确定未能合并的案例(来自df_a
,df_b
)。在R中是否有任何可能的方法,或者我们只能进行命令行操作?
修改 这可以使用this问题中的一个解决方案来实现,并且可以使用 join 函数获取许多其他信息!
答案 0 :(得分: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
答案 1 :(得分: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