我有两个数据框df1
和df2
。我想基于前两列合并数据帧。我不在乎列值的顺序,只要它们在两个数据帧中匹配(例如,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
答案 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