использование хэша для определения идентичности двух кадров данных (ЧАСТЬ 01) - PullRequest
5 голосов
/ 05 сентября 2011

Я создал набор данных, используя WHO ATC / DDD Index несколько месяцев назад, и я хочу убедиться, что база данных в сети остается неизменной сегодня, поэтому я скачал ее снова и попытался использовать digest пакет в R для сравнения.

Два набора данных (в формате txt) можно скачать здесь .(Я знаю, что вы можете думать, что файлы небезопасны и могут содержать вирусы, но я не знаю, как создать фиктивный набор данных, чтобы воспроизвести проблему, с которой я столкнулся сейчас, поэтому я наконец-то загрузил набор данных)

И я написал небольшой скрипт, как показано ниже:

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
  • line01 и line02 показываетчто все строки в ddd.old можно найти в ddd.new, и наоборот.
  • line03 показывает, что столбец hash для обоих фреймов данных является одинаковым
  • line04показывает, что два кадра данных различаются

Что происходит?Оба кадра данных с одинаковыми строками (от line01 и line02), одинакового порядка (от line03), но различны?(от line04)

Или у меня есть какое-то недопонимание по поводу digest?Спасибо.

1 Ответ

4 голосов
/ 05 сентября 2011

Считайте данные, как и раньше.

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, ])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...