2013-10-01 22 views
20

Rに大きなデータセットがあり、2つが同じかどうかを知りたいとします。私は同じ結果を得るために異なるアルゴリズムを試しているときにこれを頻繁に使用します。だから、これは私がそれらを比較するために何をすべきかです2つのデータフレームが等しいかどうかを確認する方法

df1 <- data.frame(num = 1:5, let = letters[1:5]) 
df2 <- df1 
df3 <- data.frame(num = c(1:5, NA), let = letters[1:6]) 
df4 <- df3 

:たとえば、私たちは次のデータセットを持っていると言う

> table(df1 == df2, useNA = 'ifany') 
TRUE 
    10 
:データセットは何のNAを持っていないときに素晴らしい作品

table(x == y, useNA = 'ifany') 

しかし、NAsを持っている人はそれほどではありません。

> table(df3 == df4, useNA = 'ifany') 
TRUE <NA> 
    11 1 

この例では、両方のデータフレームと等しいことがわかっているため、NAを問題なく処理することは簡単です。問題はNA == <anything>NAであることです。したがって、データセットの1つがNAである場合は、同じ位置に他のデータが何であるかは関係ありません。結果は常にNAになります。

table()を使用してデータセットを比較することは、私にとって理想的ではないようです。 どのように2つのデータフレームが同一であるかをよりよく確認できますか?

P.S:これはR - comparing several datasetsComparing 2 datasets in RまたはCompare datasets in R

+8

「同一(df1、df2)」 – Metrics

+0

@Frank、私は解決策は共通していると思いますが、問題はほぼ同じです(行列とデータフレームの違いについてのセマンティクスは得られません)。しかし、将来の検索を助けるために、私は両方のQを維持すべきだと考えます。あなたのリンクはこの同じページをターゲットにしています。ここにその他の質問のURLがあります:http://stackoverflow.com/questions/11767851/regarding-matrix-comparison-in-r –

+0

ああ、おっと。右のリンクを取得していただきありがとうございます。私は二重引用符を持つことに間違いはないと思っていますが、私がメタとブラウズを参照したことに基づいて、それらを一緒にリンクする方が良いかもしれません。ちょっとした考え。 – Frank

答えて

33

の重複しないことに注意してくださいall.equalを検索します。いくつかのライダーがいますが、それはあなたのために働くかもしれません。

all.equal(df3,df4) 
# [1] TRUE 
all.equal(df2,df1) 
# [1] TRUE 
+0

私はちょうどこの機能を知るようになっており、この特定のタスクのために実際に動作するかどうかをテストします。ありがとう! –

+9

比較される項目が等しくない場合、 'all.equal'は' FALSE'を返さないことに注意することが重要です。代わりに、 'all.equal'から' TRUE/FALSE'出力を得るには 'isTRUE(all.equal(df2、df1))'を使用しなければなりません –

+2

@RicardoSaporta、そうですが、 @Metricsが上で示唆したように、 'identical()'を使うだけで良いのです。 'all.equal()'のことは、 "ターゲットと現在の違いを記述する"ベクトルを返します。これは、探している出力の種類に応じて良いか悪いかを示します。 –

11

Metricsが指摘したように、1にもデータセットを比較するidentical()を使用することができます。このアプローチとCodoremifaの違いは、比較対象が同一かどうかに応じて、TRUEFALSEとなり、all.equal()TRUEを返すか、オブジェクト間の相違についてのヒントになります。たとえば、次の点を考慮してください

> identical(df1, df3) 
[1] FALSE 

> all.equal(df1, df3) 
[1] "Attributes: < Component 2: Numeric: lengths (5, 6) differ >"         
[2] "Component 1: Numeric: lengths (5, 6) differ"             
[3] "Component 2: Lengths: 5, 6"                 
[4] "Component 2: Attributes: < Component 2: Lengths (5, 6) differ (string compare on first 5) >" 
[5] "Component 2: Lengths (5, 6) differ (string compare on first 5)" 

また、私はidentical()をテストしてきたものからall.equal()よりもはるかに高速に実行しているようです。