2016-10-01 2 views
3

私は以下のような2つのデータフレームを持っていますが、これらのテーブルの値を(同じ行と列名に基づいて)一緒に比較し、同じ値をFALSEでTRUEで指定したいと思います。どのように2つのテーブルの値を比較することができますか?

data1: 

     id    A    B    C 
     m1    2    2    2 
     m2    2    1    2 

data2: 

     id    A    D    B 
     m1    1    2    2 
     m2    2    3    2 


Output: 

     id     A    B 
     m1    FALSE   TRUE 
     m2    TRUE   FALSE 
+0

どのコードを試しましたか? – Nate

+0

実際、何もありません。この問題は私にとっては少し難しかった.... – star

答えて

5

あなたはmelt INGの後に2つのデータフレームをmergeすることができますidによって交差する列を見つける。次に、値の等価条件を指定して新しい列を生成します。最終的にdcast出力テーブルのワイドフォーマットに戻る:

library(reshape2) 
df1 <- melt(data1,"id") 
df2 <- melt(data2,"id") 
df3 <- merge(df1,df2,by=c("id","variable")) 
df3$value <- df3$value.x == df3$value.y 
result <- dcast(df3, id~variable) 
##id  A  B 
##1 m1 FALSE TRUE 
##2 m2 TRUE FALSE 
5

、両方のデータセットに共通している列名のインデックスを作成してそれに基づいてデータセットをサブセットとの比較(==)を行う

nm1 <- intersect(names(data1), names(data2)) 
cbind(data1[1], data1[nm1][-1]==data2[nm1][-1]) 
# id  A  B 
#1 m1 FALSE TRUE 
#2 m2 TRUE FALSE 
+0

'id'が同じ順序でないと失敗する。 – 989

+0

@ m0h3n OPの投稿には、IDが同じ順序でないかどうかに関する情報はありません。 – akrun

+0

はい、提案されたソリューションがOPの記述以外の状況でどのように機能するかは常に議論の余地がありました。しかし、 'id'が厳密に同じ順序であると仮定すると、強いものです。 – 989

関連する問題