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

Я имею в виду вопрос , который я задал вчера, и у меня есть дополнительные вопросы:

Так как я понимаю, что разница в двух кадрах данных вызвана упорядочением строк, я добавил следующее:

ddd.old <- ddd.old[order(ddd.old[,"adm_route"]),]
ddd.old <- ddd.old[order(ddd.old[,"ddd"]),]
ddd.old <- ddd.old[order(ddd.old[,"atc_code"]),]
ddd.old <- data.frame(ddd.old,stringsAsFactors=FALSE)

ddd.new <- ddd.new[order(ddd.new[,"adm_route"]),]
ddd.new <- ddd.new[order(ddd.new[,"ddd"]),]
ddd.new <- ddd.new[order(ddd.new[,"atc_code"]),]
ddd.new <- data.frame(ddd.new,stringsAsFactors=FALSE)

Что дает мне что-то вроде этого:

> digest(ddd.old)
[1] "e76d3d519f3a8c066597654ae312d68d"
> digest(ddd.new)
[1] "813a68bde6840e9798db771272584e7c"
> all.equal(ddd.old, ddd.new,check.attributes=TRUE)
[1] "Attributes: < Component 2: Mean relative difference: 0.006306306 >"

Два вопроса:

  • почему дайджест все еще не получается?
  • чтоозначает вывод для all.equal?

1 Ответ

3 голосов
/ 06 сентября 2011

all.equal говорит вам, что атрибуты разные.Я предполагаю, что это имена строк.

Проверка attributes(ddd.old)[[2]] против attributes(ddd.new)[[2]].Сортировка не изменяет имена строк, поэтому вы получаете их в другом порядке.

Вы можете стереть их с помощью:

rownames(ddd.old) <- NULL
rownames(ddd.new) <- NULL

или сделать шаг раньше, добавив аргумент к data.frame:

ddd.old <- data.frame(ddd.old, stringsAsFactors=FALSE, row.names=NULL)

После этого хеш также должен быть равен.

В качестве альтернативы используйте arrange из пакета plyr, он удалит имена строк:

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

ddd.new <- arrange(ddd.new, atc_code, ddd, adm_route)
ddd.old <- arrange(ddd.new, atc_code, ddd, adm_route)
all.equal(ddd.new, ddd.old)
# TRUE
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...