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
を問題ではないとして却下するのは簡単です。問題は、_NA == <anything>
_がNA
を生成するため、データセットの1つにNA
がある場合、他のデータセットが同じ位置にあるかどうかは関係なく、結果は常にNA
になります。
したがって、table()
を使用してデータセットを比較するのは理想的ではないようです。 2つのデータフレームが同一であるかどうかを確認するにはどうすればよいですか?
追記:これは R-複数のデータセットの比較 、 Rの2つのデータセットの比較 または Rのデータセットの比較 の複製ではないことに注意してください
All.equalを検索します。いくつかのライダーがいますが、それはあなたのために働くかもしれません。
all.equal(df3,df4)
# [1] TRUE
all.equal(df2,df1)
# [1] TRUE
Metrics が指摘したように、identical()
を使用してデータセットを比較することもできます。このアプローチと Codoremifa のアプローチの違いは、比較されるオブジェクトが同一かどうかに応じて、identical()
がTRUE
のFALSE
を生成するだけであるということです。 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()
よりもはるかに高速に実行されるようです。