2017-07-17 8 views
0

は、私は2つのデータフレームを持って言う:特にはRのデータフレームに参加

df1<- data.frame(id1=c('A','B','C','D','P'), 
       id2=c('P','H','Q','S','A'),weight=c(3,4,2,7,3), stringsAsFactors=FALSE) 

df2<- data.frame(id1=c('A','H','Q','D','P'), 
       id2=c('P','B','C','S','Z'),var=c(2,1,2,2,1), stringsAsFactors=FALSE) 

私はid1id2することにより、これらの2つのデータフレームに参加したいが、時にはレコードが両方のテーブルに切り替えています。例えば、各フレームの第二と第三のレコードが同じである必要がありますし、マージされたテーブルでの出力は次のようになります。

B H 4 1 
C Q 2 2 

私は、最初の列の並べ替えについて考えとマージを行うが、このアプローチがあるため動作しません。両方のテーブルにすべてのレコードが表示されるわけではありません(ソート後でも、id1id2を切り替えることができます)。これはおもちゃの例ですが、実際のアプリケーションではid1id2は長い文字列です。

このタスクにはどのような方法で対処しますか?

答えて

2

ここでは、両方のidをソートされた方法で結合する中間列を作成して解決します。これ

df1$key <- with(df1,mapply(function(x,y){ 
    paste(sort(c(x,y)),collapse="") 
    },id1,id2)) 

df2$key <- with(df2,mapply(function(x,y){ 
    paste(sort(c(x,y)),collapse="") 
},id1,id2)) 

merge(df1,df2,by="key") 

# key id1.x id2.x weight id1.y id2.y var 
# 1 AP  A  P  3  A  P 2 
# 2 AP  P  A  3  A  P 2 
# 3 BH  B  H  4  H  B 1 
# 4 CQ  C  Q  2  Q  C 2 
# 5 DS  D  S  7  D  S 2 
+2

標準溶液を '使用paste0(PMIN(ID1、ID2)、PMAX(ID1、ID2))'の代わりに当たり行ソート – eddi

+0

@eddi良いものです。 – agstudy

関連する問題