我几个月前使用WHO ATC/DDD Index创建了一个数据集,我想确保今天数据库在线是否保持不变,所以我再次下载它并尝试使用R中的digest
包做比较。
可以下载here这两个数据集(采用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
有任何误解吗?感谢。
答案 0 :(得分:4)
像以前一样读入数据。
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"])
像Marek所说,首先检查与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, ])