【问题标题】:Why is the digest of a data.frame changed after the use of dplyr in R?为什么在 R 中使用 dplyr 后 data.frame 的摘要会发生变化?
【发布时间】:2017-01-25 17:01:43
【问题描述】:

我假设如果我有 2 个相同的 data.frames,R 摘要函数应该返回相同的结果。考虑这两个数据帧。

library(digest)
library(dplyr)
df1 <- tibble(a =1:5, b=11:15)
df2 <-  df1 %>% 
        mutate(c=b-1) %>% 
        select(-c)

两个 data.frames 在打印时是相同的,

> df1
# A tibble: 5 × 2
  a     b
  <int> <int>
1     1    11
2     2    12
3     3    13
4     4    14
5     5    15

或比较:

> df1 ==df2
        a    b
[1,] TRUE TRUE
[2,] TRUE TRUE
[3,] TRUE TRUE
[4,] TRUE TRUE
[5,] TRUE TRUE

但是,摘要函数返回不同的结果:

> digest(df1)
[1] "4f82aa1035792a0acf304242ce6ad3ec"
> digest(df2)
[1] "3b7e697af67e8e36ba9b59aef69db304"

我希望摘要函数产生相同的结果! 有没有更好的方法来比较相同的 data.frames?

【问题讨论】:

    标签: r compare dplyr digest


    【解决方案1】:

    我对@9​​87654321@了解不多,但是attributes的顺序变了,可能是因为names最后更新了:

    attributes(df1)
    
    $names
    [1] "a" "b"
    
    $class
    [1] "tbl_df"     "tbl"        "data.frame"
    
    $row.names
    [1] 1 2 3 4 5
    
    attributes(df2)
    
    $class
    [1] "tbl_df"     "tbl"        "data.frame"
    
    $row.names
    [1] 1 2 3 4 5
    
    $names
    [1] "a" "b"
    

    【讨论】:

    • 这很有趣! Mark Peterson(其他答案)在对 data.frames 进行切片后得到了相同的哈希值。这可能使属性顺序相同!谢谢!
    【解决方案2】:

    我不知道为什么digest 在两者之间有所不同。然而,重要的是要注意,这不仅仅发生在dplyr

    df3 <- df1
    df3$c <- 1
    df3 <- df3[ ,-3]
    
    digest(df3)
    

    返回第三个唯一值

    75f29cee80971220081372627632689f
    

    虽然有趣的是注意到df4 &lt;- df1[,1:2]digest 是相同的。我什至可以从 df1df2 生成相同的哈希:

    digest(df1[,1:2])
    digest(df2[,1:2])
    

    和“f111f4b3d65b8bc2569a4b79a821a6d8”的不同(共享)散列与

    digest(as.data.frame(df1[,1:2]))
    digest(as.data.frame(df2[,1:2]))
    

    它必须与 R 在将变量存储在内存中时如何处理变量的创建有关。我的理解是digest 没有给出变量 within 值的哈希值,而是变量本身的哈希值。因此,您可能需要添加一个以相同方式生成变量的步骤,以使哈希值一致。

    但是,如果您正在寻找不同的比较方式,我会建议 all_equaldplyr

    all_equal(df1, df2)
    

    返回TRUE 并允许对可能很好的边缘情况进行一些处理(例如,默认情况下它不关心行或列是否重新排列)。如果您的目标只是检查两个数据集的一致性,那么这可能是比与digest 战斗“更好”的方法

    【讨论】:

    • 谢谢! all_equal() 现在应该可以解决问题了! data.frame 切片可能会有所帮助,因为 Axeman 指出,属性顺序已更改。
    猜你喜欢
    • 2019-12-20
    • 2020-07-11
    • 1970-01-01
    • 2021-11-17
    • 1970-01-01
    • 1970-01-01
    • 2021-12-16
    • 1970-01-01
    相关资源
    最近更新 更多