R 如何使用不同的变量作为键多次左键连接两个数据集?
我正在使用left_join组合两个数据帧,因为我需要保留R 如何使用不同的变量作为键多次左键连接两个数据集?,r,dataframe,left-join,R,Dataframe,Left Join,我正在使用left_join组合两个数据帧,因为我需要保留X中的所有行,并且只保留Y中匹配的行。但是,没有一列可以提供完美的匹配。相反,在X中有一列与Y中的两列部分匹配,在X中有第二列与Y中的第三列部分匹配。只有在所有3行上进行匹配,我才能充分合并数据,因为它们在不同的行组合上都匹配(有一些重叠) 到目前为止,我的策略是执行三个独立的left\u join命令,每个命令都有不同的匹配项。这样做使我能够匹配大约95%的行(第一个匹配只得到大约70%)。但是,在合并数据中,Y中的每一列都有三个版本。
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@Tomdata.table::melt
或dplyr::pivot\u更长的列。这将把所有的值合并到一个列中。在合并它们之前,最好在两个dfs中透视这些列。我真的不明白你想做什么。您能否提供示例数据和预期输出?此外,如果你想要或逻辑,你可以使用符号“|”嗨,阿尼尔-你说的旋转它们是什么意思?嗨,马尔夫,我试着用OR和|运行一个左连接,但它不允许我运行它。我也找不到任何由searchi完成的示例