2011-09-05 9 views
5

私は数ヶ月前にWHO ATC/DDD Indexを使ってデータセットを作成しましたが、データベースをオンラインで変更しないでください。比較のためにRのdigestパッケージを実行します。ハッシュを使用して2つのデータフレームが同一であるかどうかを確認する(PART 01)

2つのデータセット(txt形式)はhereからダウンロードできます。 (ファイルが安全でなく、ウイルスに感染している可能性があると思うかもしれませんが、私は今問題を再現するためにダミーデータセットを生成する方法を知らないので、最終的にデータセットをアップロードします)

以下のように小さなスクリプトを書いた:

library(digest) 

ddd.old <- read.table("ddd.table.old.txt",header=TRUE,stringsAsFactors=FALSE) 
ddd.new <- read.table("ddd.table.new.txt",header=TRUE,stringsAsFactors=FALSE) 


ddd.old[,"ddd"] <- as.character(ddd.old[,"ddd"]) 
ddd.new[,"ddd"] <- as.character(ddd.new[,"ddd"]) 

ddd.old <- data.frame(ddd.old, hash = apply(ddd.old, 1, digest),stringsAsFactors=FALSE) 
ddd.new <- data.frame(ddd.new, hash = apply(ddd.new, 1, digest),stringsAsFactors=FALSE) 

ddd.old <- ddd.old[order(ddd.old[,"hash"]),] 
ddd.new <- ddd.new[order(ddd.new[,"hash"]),] 

そして、私がチェックを行うときに、本当に面白いことが起こります。

> table(ddd.old[,"hash"]%in%ddd.new[,"hash"]) #line01 

TRUE 
506 
> table(ddd.new[,"hash"]%in%ddd.old[,"hash"]) #line02 

TRUE 
506 
> digest(ddd.old[,"hash"])==digest(ddd.new[,"hash"]) #line03 
[1] TRUE 
> digest(ddd.old)==digest(ddd.new) #line04 
[1] FALSE 
  • line01line02を示しているすべての行I n ddd.oldddd.newにあり、その逆もあります。
  • line03
  • は、両方のデータフレームのため hash列が同じ
  • line04 2つのデータフレームが起こる何

異なっていることを示していることを示して?両方のデータフレームが同一の行(line01line02)から同じオーダー(line03)ですが、違いはありますか? (line04から)

digestについての誤解はありますか?ありがとう。

+2

違いを確認するには、 'all.equal(ddd.old、ddd.new)'を使用できます。 – Marek

答えて

4

前述のようにデータを読み込みます。マレク同様

ddd.old <- read.table("ddd.table.old.txt",header=TRUE,stringsAsFactors=FALSE) 
ddd.new <- read.table("ddd.table.new.txt",header=TRUE,stringsAsFactors=FALSE) 
ddd.old[,"ddd"] <- as.character(ddd.old[,"ddd"]) 
ddd.new[,"ddd"] <- as.character(ddd.new[,"ddd"]) 

all.equalとの違いを確認することから始め、言いました。

all.equal(ddd.old, ddd.new) 
[1] "Component 6: 4 string mismatches" 
[2] "Component 8: 24 string mismatches" 

だから、私たちは列6,8

different.old <- ddd.old[, c(6, 8)] 
different.new <- ddd.new[, c(6, 8)] 

を見てする必要がありますが、これらの列をハッシュ。

hash.old <- apply(different.old, 1, digest) 
hash.new <- apply(different.new, 1, digest) 

そして、一致しない行を見つけます。

different_rows <- which(hash.old != hash.new) #which is optional 

最後に、データセットを結合します。

cbind(different.old[different_rows, ], different.new[different_rows, ]) 
関連する問題