2011-09-05 3 views
5

He creado un conjunto de datos usando WHO ATC/DDD Index unos meses antes y quiero asegurarme de que la base de datos en línea permanezca sin cambios hoy, así que la descargué nuevamente y traté de usar el paquete digest en R para hacer la comparación.usando hash para determinar si 2 dataframes son idénticos (PARTE 01)

Los dos conjuntos de datos (en formato txt) se pueden descargar here. (Soy consciente de que puede pensar que los archivos no son seguros y pueden tener virus, pero no sé cómo generar un conjunto de datos ficticio para replicar el problema que tengo ahora, así que cargo el conjunto de datos finalmente)

y yo han escrito un pequeño script de la siguiente manera:

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

y algo realmente interesante sucede cuando lo haga la comprobación:

> 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 y line02 muestra que cada filas i n ddd.old se puede encontrar en ddd.new, y viceversa.
  • line03 muestra que la columna hash para ambos trama de datos son los mismos
  • line04 muestra que los dos son diferentes trama de datos

Qué ocurre? Ambos dataframe con las filas idénticas (desde line01 y line02), mismo orden (desde line03), pero son diferentes? (desde line04)

¿O tengo algún malentendido sobre digest? Gracias.

+2

Puede usar 'all.equal (ddd.old, ddd.new)' para verificar diferencias. – Marek

Respuesta

4

Lea en los datos como antes.

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

Como dijo Marek, se inicia mediante la comprobación de las diferencias con all.equal.

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

Así que sólo tiene que mirar en las columnas 6 y 8.

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

Hash estas columnas.

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

Y encuentre las filas donde no coinciden.

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

Por último, se combinan los conjuntos de datos.

cbind(different.old[different_rows, ], different.new[different_rows, ]) 
Cuestiones relacionadas