R 如何使用不同的变量作为键多次左键连接两个数据集?

R 如何使用不同的变量作为键多次左键连接两个数据集?,r,dataframe,left-join,R,Dataframe,Left Join,我正在使用left_join组合两个数据帧,因为我需要保留X中的所有行,并且只保留Y中匹配的行。但是,没有一列可以提供完美的匹配。相反,在X中有一列与Y中的两列部分匹配,在X中有第二列与Y中的第三列部分匹配。只有在所有3行上进行匹配,我才能充分合并数据,因为它们在不同的行组合上都匹配(有一些重叠) 到目前为止,我的策略是执行三个独立的left\u join命令,每个命令都有不同的匹配项。这样做使我能够匹配大约95%的行(第一个匹配只得到大约70%)。但是,在合并数据中,Y中的每一列都有三个版本。

我正在使用left_join组合两个数据帧,因为我需要保留
X
中的所有行,并且只保留
Y
中匹配的行。但是,没有一列可以提供完美的匹配。相反,在
X
中有一列与
Y
中的两列部分匹配,在
X
中有第二列与
Y
中的第三列部分匹配。只有在所有3行上进行匹配,我才能充分合并数据,因为它们在不同的行组合上都匹配(有一些重叠)

到目前为止,我的策略是执行三个独立的
left\u join
命令,每个命令都有不同的匹配项。这样做使我能够匹配大约95%的行(第一个匹配只得到大约70%)。但是,在合并数据中,
Y
中的每一列都有三个版本。我尝试过使用粘贴和许多其他方法来组合它们,但要么没有效果,要么新列没有帮助,因为它们是连接在一起的(例如显示“12345 NA 12345”或“NA NA”)。我需要它只显示第一个非NA结果,因为所有非NA结果都是相同的。因此,对于上面的两个示例,我只想返回“12345”和“NA”

因此,我认为我需要弄清楚如何在多个列上进行左联合(这不起作用,但类似于:

left_join(X, Y, by = (c("Column1" = Column1) OR c("Column1" = "Column2") OR c( Column 2, Y = "Column 3")).  
或者,不那么优雅,我只需要弄清楚如何重新格式化合并/粘贴的列,以仅保留第一个非NA结果

在下面的示例中,X有2列5行,Y有4列7行(其中5行与X中的行匹配)。完全合并X和Y的唯一方法是将X$Column1与Y$Column1或Y$Column2匹配,或将X$Column2与Y$Column3匹配。在实际数据中,
X
中约有50000行,在
X
Y
中也有许多其他列。下面的输出应该是X中的五行(在Y中也有匹配项),以及Y$Column4中的相应值

X$Column1 = c(10, 150, 3550, 9421, 22000)
X$Column2 = c(Dog, Cat, Bird, Rat, Fox)
Y$Column1 = c(NA, 453, NA, NA, 3550, 9421, NA, 4200)
Y$Column2 = c(22, NA, 10, 150, 3550, NA, NA, 4200)
Y$Column3 = c(NA, Badger, Dog, NA, NA, NA, Fox, Mouse)
Y$Column4 = c(NA, 4500, 12345, 54, NA, 5555, 321, 65, 20)
从上面我想返回5行(X中的每行一行),以及3列(X的3个原始列加上Y的第4列)。Y中的其他三列仅用于匹配。在上面的例子中,在我的数据中,如果不加入所有三场比赛,就无法完成完整(或接近完整)的比赛。多年来,我一直在寻找这样做的方法,但运气不好,但我对R很陌生,如果我很愚蠢,我很抱歉

我现在的代码是:

merged_pvga <- left_join(merged_pvga, sherpa, by = c("issn1" = "issn_print"))
merged_pvga <- left_join(merged_pvga, sherpa, by = c("issn1" = "issn_electronic"))
merged_pvga <- left_join(merged_pvga, sherpa, by = (c("journal_title" = "title")))
merged_pvga$id_all <- paste(merged_pvga$id.x, merged_pvga$id.y, merged_pvga$id)
merged_pvga$subject_all <- paste(merged_pvga$subject.x, merged_pvga$subject.y, merged_pvga$subject)

merged_pvga这里是一个左连接数据
Y
X
的示例,在变量
ColumnA
上使用
X
两次,然后在变量
ColumnB
上使用

注:

  • Y
    X
    共享两个变量
    ColumnA
    ColumnB
    ,因此在每次左连接后,您希望合并未用作连接键的列(例如,在连接
    ColumnA
    后,合并两个数据集的
    ColumnB
  • 一定要知道你想做什么,关于两个不同的变量连接两次可能出现的潜在重叠。下面的示例对第一个左连接进行了优先级排序,因为已经从
    X
    连接的那些左连接在第二个左连接中被排除
库(dplyr)
X=tibble(id_X=1:5)
Y=tibble(id_Y=1:8)
X$ColumnA=c(101503550942122000)
X$ColumnB=c(‘狗’、‘猫’、‘鸟’、‘老鼠’、‘狐狸’)
Y$ColumnA=c(NA,453,NA,NA,35509421,NA,4200)
Y$Column2=c(22,NA,101503550,NA,NA,4200)
Y$ColumnB=c(不适用于‘獾’、‘狗’、不适用于‘狐狸’、‘老鼠’)
Y$Column4=c(北美,450012345,54,北美,555532165)

将_na_替换为_blank这里是一个左连接数据
Y
替换为
X
的示例,在变量
ColumnA
上使用
X
两次,然后在变量
ColumnB
上使用

注:

  • Y
    X
    共享两个变量
    ColumnA
    ColumnB
    ,因此在每次左连接后,您希望合并未用作连接键的列(例如,在连接
    ColumnA
    后,合并两个数据集的
    ColumnB
  • 一定要知道你想做什么,关于两个不同的变量连接两次可能出现的潜在重叠。下面的示例对第一个左连接进行了优先级排序,因为已经从
    X
    连接的那些左连接在第二个左连接中被排除
库(dplyr)
X=tibble(id_X=1:5)
Y=tibble(id_Y=1:8)
X$ColumnA=c(101503550942122000)
X$ColumnB=c(‘狗’、‘猫’、‘鸟’、‘老鼠’、‘狐狸’)
Y$ColumnA=c(NA,453,NA,NA,35509421,NA,4200)
Y$Column2=c(22,NA,101503550,NA,NA,4200)
Y$ColumnB=c(不适用于‘獾’、‘狗’、不适用于‘狐狸’、‘老鼠’)
Y$Column4=c(北美,450012345,54,北美,555532165)

在加入dfs之前,最好在两个dfs中透视这样的列。我真的不明白你想做什么。您能否提供示例数据和预期输出?此外,如果你想要或逻辑,你可以使用符号“|”嗨,阿尼尔-你说的旋转它们是什么意思?嗨,马尔夫,我试着用OR和|运行一个左连接,但它不允许我运行它。我也找不到任何在线搜索的例子,所以我不知道这是否可行。我将考虑如何提供示例数据和预期输出。Thanks@Tom
data.table::melt
dplyr::pivot\u更长的列。这将把所有的值合并到一个列中。在合并它们之前,最好在两个dfs中透视这些列。我真的不明白你想做什么。您能否提供示例数据和预期输出?此外,如果你想要或逻辑,你可以使用符号“|”嗨,阿尼尔-你说的旋转它们是什么意思?嗨,马尔夫,我试着用OR和|运行一个左连接,但它不允许我运行它。我也找不到任何由searchi完成的示例