我有两个数据帧df_1df_2(参见下面的dput()),我希望使用LEFT_JOIN基于多个列进行连接.但是,如果至少有一列匹配(如果不是更多),我希望执行成功的联接.

我目前正在使用代码

join <- left_join(df_1, df_2, by = join_by(Txt_y == Txt_x, Head == Tail), keep = TRUE, na_matches = "never", multiple = "warning", unmatched = "drop")

如果至少有一列有匹配,我如何调整join_by()才能获得匹配?

以下是这两个数据帧的dput():

structure(list(Name_y = c("etwbv", "werg", "sdfg", "qwreg", "gvr", 
"wref"), URL_y = c("ewrg", "werg", "asd", "qwe", "gvre", "vrw"
), Txt_y = c("abc", "bfh", "fse", "rege", "wer", "vwr"), Head = c("abc1", 
"bfh", "fse", "rege1", "wer", "vwr")), class = "data.frame", row.names = c(NA, 
-6L))

structure(list(Name_x = c("etwbv", "werg", "sdfg", "qwreg", "gvr", 
"wref"), URL_x = c("ewrg", "werg", "asd", "qwe", "gvre", "vrw"
), Txt_x = c("abc", "rfwcq", "fse", "wefc", "aefc", "vwr"), Tail = c("abc1", 
"bfh", "fse", "wreg", "ecdw", "vwr")), class = "data.frame", row.names = c(NA, 
-6L))

这就是我想要的输出:

Name_y  URL_y   Txt_y  Head  Name_x URL_x  Txt_x  Tail 
etwbv   ewrg    abc    abc1  etwbv  ewrg   abc    abc1
werg    werg    bfh    bfh   werg   werg   rfwcq  bfh
sdfg    asd     fse    fse   sdfg   asd    fse    fse
qwreg   qwe     rege   rege1 NA     NA     NA     NA
gvr     gvre    wer    wer   NA     NA     NA     NA
wref    vrw     vwr    vwr   wref   vrw    vwr    vwr

使用上面的代码,我当前获得了df_2的第二行的Nas,但是由于列HeadTail之间至少有一个匹配,所以我希望将该匹配放入新的数据帧join中.我如何调整我的代码来实现这一点?

推荐答案

使用{PowerJoin}:

library(powerjoin)
power_left_join(df_1, df_2, by = ~ .x$Txt_y == .y$Txt_x | .x$Head == .y$Tail)
#>   Name_y URL_y Txt_y  Head Name_x URL_x Txt_x Tail
#> 1  etwbv  ewrg   abc  abc1  etwbv  ewrg   abc abc1
#> 2   werg  werg   bfh   bfh   werg  werg rfwcq  bfh
#> 3   sdfg   asd   fse   fse   sdfg   asd   fse  fse
#> 4  qwreg   qwe  rege rege1   <NA>  <NA>  <NA> <NA>
#> 5    gvr  gvre   wer   wer   <NA>  <NA>  <NA> <NA>
#> 6   wref   vrw   vwr   vwr   wref   vrw   vwr  vwr

创建于2023-03-16年第reprex v2.0.2

如果在by中使用的某些列中有一些NAS,则此操作将失败.

df_1$Txt_y[1] <- NA

power_left_join(df_1, df_2, by = ~ .x$Txt_y == .y$Txt_x | .x$Head == .y$Tail)
#> Error in if (sum(m) == 0) {: missing value where TRUE/FALSE needed

您还需要:

power_left_join(df_1, df_2, by = ~ dplyr::if_else(.x$Txt_y == .y$Txt_x | .x$Head == .y$Tail, TRUE, FALSE, FALSE))
#>   Name_y URL_y Txt_y  Head Name_x URL_x Txt_x Tail
#> 1  etwbv  ewrg  <NA>  abc1  etwbv  ewrg   abc abc1
#> 2   werg  werg   bfh   bfh   werg  werg rfwcq  bfh
#> 3   sdfg   asd   fse   fse   sdfg   asd   fse  fse
#> 4  qwreg   qwe  rege rege1   <NA>  <NA>  <NA> <NA>
#> 5    gvr  gvre   wer   wer   <NA>  <NA>  <NA> <NA>
#> 6   wref   vrw   vwr   vwr   wref   vrw   vwr  vwr

不过,我认为在默认情况下驳回NAS是有意义的.因此,这一行为可能会在进一步的版本中得到增强(我是作者).可以肯定的是,错误消息并不令人满意.

R相关问答推荐

如何判断某列中由某些行组成的百分比

如果列中存在相同的字符串,则对行值进行总和

隐藏e_mark_line的工具提示

有没有一个R函数允许你从一个数字变量中提取一个数字,而不考虑它的位置(不仅仅是第一个或最后一个数字?

ggplot2中的X轴显示数值,单位为百,而不是十

使用across,starts_with和ifelse语句变更多个变量

通过在colname中查找其相应值来创建列

使用R中的正则表达式将一列分割为多列

LOF中的插图短文字幕

R Select()可以测试不存在的子集列

计算数据帧中指定值之前的行数,仅基于每行之后的future 行,单位为r

R中的类别比较

当每个变量值只能 Select 一次时,如何从数据框中 Select 两个变量的组合?

Conditional documentr::R中数据帧的summarize()

Broom.Mixed::Augment不适用于Sample::分析

附加中缀操作符

如何捕获这个shiny 的、可扩展的react 性用户输入矩阵作为另一个react 性对象,以便进一步操作?

在使用ggplot2的情况下,如何在使用coord_trans函数的同时,根据未转换的坐标比来定位geom_瓷砖?

R,将组ID分配给另一个观测ID变量中的值的组合

在子图内和子图之间对齐行数不均匀的表格罗布对