2011-09-05 6 views
5

Utworzyłem zestaw danych za pomocą WHO ATC/DDD Index kilka miesięcy wcześniej i chcę się upewnić, że baza danych online pozostanie niezmieniona już dziś, więc pobrałem ją ponownie i spróbowałem użyć pakiet digest w R, aby dokonać porównania.za pomocą skrótu do określenia, czy 2 ramki danych są identyczne (CZĘŚĆ 01)

Dwa zestawy danych (w formacie txt) można pobrać here. (Jestem świadomy, że możesz uważać, że pliki są niebezpieczne i mogą zawierać wirusa, ale nie wiem, jak wygenerować fałszywy zestaw danych w celu odtworzenia problemu, który mam teraz, więc ostatecznie przesyłaję zestaw danych)

napisałem mały skrypt jak poniżej:

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"]),] 

i coś naprawdę ciekawe dzieje się, gdy robię sprawdzanie:

> 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 
  • line01 i line02 pokazuje, że co rzędy i n ddd.old można znaleźć w ddd.new i na odwrót.
  • line03 wskazuje, że kolumna hash zarówno dataframe są takie same
  • line04 pokazuje, że dwa dataframe różnią

Co się stało? Obie ramki danych z identycznymi wierszami (od line01 i line02), w tej samej kolejności (od line03), ale są różne? (od line04)

Czy mam jakieś nieporozumienie dotyczące digest? Dzięki.

+2

Można użyć 'all.equal (ddd.old, ddd.new)', aby sprawdzić różnice. – Marek

Odpowiedz

4

Odczytywanie danych jak wcześniej.

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"]) 

Tak jak powiedział Marek, zacznij od sprawdzenia różnic z all.equal.

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

Więc po prostu trzeba spojrzeć na kolumnach 6 i 8.

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

Hash te kolumny.

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

I znajdź wiersze, w których nie pasują.

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

Na koniec połącz zbiory danych.

cbind(different.old[different_rows, ], different.new[different_rows, ]) 
Powiązane problemy