如何基于两个无序列

时间:2016-05-10 14:14:23

标签: r

我有两个数据框df1df2。我想基于前两列合并数据帧。我不在乎列值的顺序,只要它们在两个数据帧中匹配(例如,df1中的第3行与df2的第2行匹配,而不管r和{{的顺序如何1}}。同样,z的第2行与df1的第4行匹配。我想在df2中添加匹配的V3列并获得结果。

DF1

df1

DF2

A  B  C
p  x  1
q  y  3 
r  z  7

结果

v1  v2  v3
p   x   65
r   z   32
t   u   6
y   q   34 

2 个答案:

答案 0 :(得分:1)

首先对df2的前两列中的值进行排序,然后排序merge()

df2[1:2] <- t(apply(df2[1:2], 1, sort))
merge(df1, df2, by.x=c("A", "B"), by.y=c("v1", "v2"))
# > merge(df1, df2, by.x=c("A", "B"), by.y=c("v1", "v2"))
#   A B C v3
# 1 p x 1 65
# 2 q y 3 34
# 3 r z 7 32

如果需要,您也可以在df1中进行类似的排序。 使用的数据:

df1 <- read.table(header=TRUE, text=
"A  B  C
p  x  1
q  y  3 
r  z  7")
df2 <- read.table(header=TRUE, text=
"v1  v2  v3
p   x   65
r   z   32
t   u   6
y   q   34 ")

答案 1 :(得分:1)

您可以创建两个新数据框,一个来自合并c('A','B')c('v1','v2')之间的相等,然后通过合并c('B', 'A')c('v1','v2')之间的相等来创建一个数据框,然后rbind他们。

df1 <- data.frame(A=c('p', 'q', 'r'), B=c('x','y','z'), C=c(1,2,3) )
df2 <- data.frame(v1=c('p',  'r', 't', 'y'), v2=c('x', 'z', 'u', 'q'), v3=c(65,32, 6, 34))


df3 <- merge(df1, df2, by.x = c('A', 'B'), by.y = c('v1', 'v2'))

#The other way around
df4 <- merge(df1, df2, by.x = c('B', 'A'), by.y = c('v1', 'v2'))

#Rearrange df4 columns
df4 <- df4[colnames(df3)] 

df5 <- rbind(df3, df4)
df5

df5
A B C v3
p x 1 65
r z 3 32
q y 2 34