根据共享值合并两个数据帧

时间:2018-05-16 09:16:08

标签: r dataframe merge subset

我有两个数据框。第一个是这样的:

df1<-read.table(text="   V1  V2  V3  V4  V5
               1   a   a   1.5147654   1.5147654   1.5147654
               2   a   c   1.97638457  1.97638457  1.97638457
               3   c   d   1.55151792  -2.38160971 1.55151792
               4   a   b   2.25182522  2.25182522  -1.3523473
               5   b   d   1.85349445  1.85349445  1.85349445
               ",
               header=TRUE)

第二个如下:

df2<-read.table(text="   V1  V2  V3
                   1    a   b   1
                   2    c   a   1.5
                   3    d   b   3.5
                   4    d   c   5.1
                   ",
                   header=TRUE)

我想以这样的方式合并它们,我的最终结果就是这样:

V1  V2  V3  V4  V5  V6
a   b   1   2.25182522  2.25182522  -1.3523473
c   a   1.5 1.97638457  1.97638457  1.97638457
d   b   3.5 1.85349445  1.85349445  1.85349445
d   c   5.1 1.55151792  -2.38160971 1.55151792

我的意思是如果df2的两个第一列的值在df1的前两列中,那么我想合并它们以获得上述结果。有什么想法吗?

1 个答案:

答案 0 :(得分:3)

生成odered key 列然后合并:

df1$key <- apply(df1[1:2], 1, function(i) toString(sort(i)))
df2$key <- apply(df2[1:2], 1, function(i) toString(sort(i)))

merge(df2, df1, by = "key")
#    key V1.x V2.x V3.x V1.y V2.y     V3.y        V4        V5
# 1 a, b    a    b  1.0    a    b 2.251825  2.251825 -1.352347
# 2 a, c    c    a  1.5    a    c 1.976385  1.976385  1.976385
# 3 b, d    d    b  3.5    b    d 1.853494  1.853494  1.853494
# 4 c, d    d    c  5.1    c    d 1.551518 -2.381610  1.551518