2016-05-10 11 views
-1

2つのデータフレームdf1df2があります。最初の2つの列に基づいてデータフレームをマージします。両方のデータフレームで一致する限り、列の値の順序は気にしません(たとえば、df1の3行目はrおよびzの順序にかかわらずdf2の2行目と一致します)。同様に、2行目はdf1第4行のdf2と一致します)。一致したV3列をdf1に追加して結果を得たいと思います。2つの順序付けられていない列に基づいて2つのデータフレームの列値をマージする方法

DF1

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

DF2

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

結果

A B C V3 
p x 1 65 
q y 3 34 
r z 7 32 
+1

'df2 [1:2] < - t(apply(df2 [1:2]、1、sort))' 'merge()' – jogo

答えて

1

次いでdf2merge()の最初の2列に値をソートまず:

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

あなたがc('A','B')c('v1','v2')間の平等にマージする二つの新しいデータフレーム、1を作成することができ、その後、c('B', 'A')c('v1','v2')間の平等に合併から1を作成するには、それらを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 
関連する問題