基于匹配每个数据帧中的两个可交换列来合并两个数据帧

a83*_*a83 6 merge r match dataframe

我在R中有两个数据帧.

数据帧1

A B C D E F G
1 2 a a a a a
2 3 b b b c c
4 1 e e f f e
Run Code Online (Sandbox Code Playgroud)

数据帧2

X Y Z
1 2 g
2 1 h
3 4 i
1 4 j
Run Code Online (Sandbox Code Playgroud)

我想将dataframe1的A列和B列与dataframe2的X和Y列匹配.它不是成对比较,即第1行(A = 1 B = 2)被认为与第1行相同(X = 1,Y = 2) )和数据帧2的第2行(X = 2,Y = 1).

当找到匹配时,我想将dataframe1的C,D,E,F列添加回dataframe2的匹配行,如下所示:没有匹配为na.

最终的数据框架

X Y Z C  D  E  F  G
1 2 g a  a  a  a  a 
2 1 h a  a  a  a  a
3 4 i na na na na na
1 4 j e  e  f  f  e
Run Code Online (Sandbox Code Playgroud)

我只能知道如何匹配单列,但是,如何匹配两个可交换列并根据匹配结果合并两个数据帧对我来说很难.请帮助提供这样做的聪明方法.

为了便于讨论(感谢Vincent和DWin(我以前的问题)的评论,我应该测试引用.)有将数据帧1和2加载到R的配额.

df1 <- data.frame(A = c(1,2,4), B=c(2,3,1), C=c('a','b','e'), 
                                D=c('a','b','e'), E=c('a','b','f'), 
                                F=c('a','c','f'), G=c('a','c', 'e'))

df2  <- data.frame(X = c(1,2,3,1), Y=c(2,1,4,4), Z=letters[7:10])
Run Code Online (Sandbox Code Playgroud)

And*_*rie 6

以下工作,但无疑可以改进.

我首先创建一个小辅助函数,在A和B上执行行方式排序(并将其重命名为V1和V2).

replace_index <- function(dat){
  x <- as.data.frame(t(sapply(seq_len(nrow(dat)), 
    function(i)sort(unlist(dat[i, 1:2])))))
  names(x) <- paste("V", seq_len(ncol(x)), sep="")
  data.frame(x, dat[, -(1:2), drop=FALSE])
} 

replace_index(df1)

  V1 V2 C D E F G
1  1  2 a a a a a
2  2  3 b b b c c
3  1  4 e e f f e
Run Code Online (Sandbox Code Playgroud)

这意味着您可以使用直接merge组合数据.

merge(replace_index(df1), replace_index(df2), all.y=TRUE)

  V1 V2    C    D    E    F    G Z
1  1  2    a    a    a    a    a g
2  1  2    a    a    a    a    a h
3  1  4    e    e    f    f    e j
4  3  4 <NA> <NA> <NA> <NA> <NA> i
Run Code Online (Sandbox Code Playgroud)