使用哈希来确定2个数据帧是否相同(第02部分)

时间:2011-09-06 03:31:39

标签: r hash

我指的是我昨天问过的question并有后续问题:

由于我意识到2个数据帧的差异是由行的排序引起的,所以我添加了以下内容:

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 个答案:

答案 0 :(得分:3)

all.equal告诉您属性不同。我猜这是行名。

检查attributes(ddd.old)[[2]] vs 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)

之后哈希也应该相等。

或者从plyr包中使用arrange,它将删除rownames:

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