web-dev-qa-db-ja.com

2つのデータフレームが等しいかどうかを確認する方法

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のデータセットの比較 の複製ではないことに注意してください

40
Waldir Leoncio

All.equalを検索します。いくつかのライダーがいますが、それはあなたのために働くかもしれません。

all.equal(df3,df4)
# [1] TRUE
all.equal(df2,df1)
# [1] TRUE
55
TheComeOnMan

Metrics が指摘したように、identical()を使用してデータセットを比較することもできます。このアプローチと Codoremifa のアプローチの違いは、比較されるオブジェクトが同一かどうかに応じて、identical()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()よりもはるかに高速に実行されるようです。

24
Waldir Leoncio