gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 20:20:21 25 4
gpt4 key购买 nike

我使用 WHO ATC/DDD Index 创建了一个数据集几个月前,我想确定今天在线数据库是否保持不变,所以我再次下载并尝试使用digest R 中的包进行比较。

两个数据集(txt格式)可以下载here . (我知道你可能认为文件不安全,可能有病毒,但我不知道如何生成一个虚拟数据集来复制我现在遇到的问题,所以我最后上传了数据集)

我写了一个小脚本如下:

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
  • line01line02显示 ddd.old 中的每一行可以在 ddd.new 中找到,反之亦然。
  • line03显示 hash两个数据框的列相同
  • line04显示两个数据帧不同

  • 发生什么事?具有相同行(来自 line01line02 )、相同顺序(来自 line03 )的两个数据帧,但有什么不同? (来自 line04)

    或者我对 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"])

    就像 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, ])

    关于r - 使用哈希来确定 2 个数据帧是否相同(第 01 部分),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7306212/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com