Rで解析:オブジェクト内容の違いを判断!コマンド紹介と「compare」パッケージ

Rの解析に役に立つ記事

「違い」のシソーラスを調べると、差異・差・溝・開き・隔たり・異なり・食い違いなど日本語の多様性に改めて驚かされます。しかし、データ解析でオブジェクトの「違い」を正確に判断できないとエラーや致命的な誤解釈の原因となります。

Rのオブジェクト内容の比較方法の例と、便利な「compare」パッケージを紹介します。

違いの判断や結果の再現性は6シグマに近づけたいものです。

パッケージのバージョンは0.2-6。R version 3.2.1でコマンドを確認しています。


スポンサーリンク
スポンサーリンク

パッケージのインストール

下記コマンドを実行してください。

#パッケージのインストール
install.packages("compare")

実行コマンド

詳細はコマンド、パッケージヘルプを確認してください。

#オブジェクトの完全一致:identicalコマンド
#整数だと
identical(3 - 2, 1)
[1] TRUE
class(3 - 2)
[1] "numeric"
#小数を含むと
identical(3.3 - 2.2, 1.1)
[1] FALSE
class(3.3 - 2.2)
[1] "numeric"
#となります

#小数を含んだ比較として
#ほぼ等しい判断:all.equalコマンド
identical(all.equal(3.3 - 2.2, 1.1), TRUE)
[1] TRUE
identical(all.equal(3.000003 - 2.000002, 1.000001), TRUE)
[1] TRUE

#all.equalコマンドは等しくない場合,その情報を示します
Char1 <- c("K", "R", "A", "D", "A")
Char2 <- factor(Char1)
all.equal(Char1, Char2)
[1] "Modes: character, numeric"                                       
[2] "Attributes: <  引数 target は NULL、引数 current は list です  >"
[3] "target is character, current is factor" 

###ここからcompareパッケージ#####
#パッケージの読み込み
library("compare")

###compareパッケージの利用#####
#比較対象のクラスを自動で変換:compareコマンド
#数値を丸めるオプション以外を適応:allowAllオプション;初期値TURE
#小数を含む数字の比較
compare(model = 3.3 - 2.2, comparison = 1.1, allowAll = TRUE)
TRUE
#comparisonのクラスをmodelのクラスに変換:coerceオプション
compare(model = Char1, comparison = Char2, coerce = TRUE)
TRUE
coerced from <factor> to <character>

#data.frameの比較も可能です
TestData1 <- data.frame(x = 1:5,
                        y = letters[1:5],
                        z = c("あ", "い", "う", "え", "お"))
TestData2 <- data.frame(x = 5:1,
                        y = letters[1:5],
                        z = rev(c("あ", "い", "う", "え", "お")))
#確認
compare(model = TestData1, comparison = TestData2, allowAll = FALSE)  
FALSE [FALSE, TRUE, FALSE]  

#数値を丸めて、並び順を無視してcomparisonのクラスを変換して比較
#数値丸め:roundオプション
#順序を無視:ignoreOrderオプション
compare(model = as.numeric(1:10),
        comparison = as.character(10:1 + .1),
        round = TRUE, coerce = TRUE, ignoreOrder = TRUE)  
#as.numeric(1:10)  
#[1]  1  2  3  4  5  6  7  8  9 10  
#as.character(10:1 + .1) 
#[1] "10.1" "9.1"  "8.1"  "7.1"  "6.1"  "5.1"  "4.1"  "3.1"  "2.1"  "1.1" 
TRUE
coerced from <character> to <numeric>
sorted
rounded

少しでも、あなたのウェブや実験の解析が楽になりますように!!

タイトルとURLをコピーしました