77

R に大きなデータセットがあり、そのうちの 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(x == y, useNA = 'ifany')

データセットに NA がない場合、これはうまく機能します。

> table(df1 == df2, useNA = 'ifany')
TRUE 
  10 

ただし、NA がある場合はそれほど多くはありません。

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

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

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

PS: これはR の複製ではないことに注意してください - 複数のデータセット比較する、R で 2 つのデータセットを比較する、またはRでデータセットを比較する

4

2 に答える 2

37

Metricsが指摘したように、データセットの比較にも使用できますidentical()。このアプローチとコドレミファのアプローチの違いは、比較対象のオブジェクトが同一であるかどうかに応じて を生成するだけであるのに対し、identical()オブジェクト間の違いを返すかヒントを与えることです。たとえば、次のことを考慮してください。TRUEFALSEall.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()

于 2013-10-01T18:05:07.543 に答える