【问题标题】:After doing bind_rows() and rbind() on same data.tables , identical() = FALSE?在相同的 data.tables 上执行 bind_rows() 和 rbind() 后,相同()= FALSE?
【发布时间】:2019-01-02 13:20:12
【问题描述】:

警告:新手。我有几个 data.tables,每个都有数百万行,变量主要是日期和因素。我正在使用 rbindlist() 将它们组合because。昨天,在将表格垂直分解成更小的部分(而不是当前的水平拼接)之后,我试图更好地理解 rbind(尤其是使用 fill = TRUE)并且还尝试了 bind_rows() 然后尝试验证结果但相同( ) 返回 FALSE。

library(data.table)
library(dplyr)
DT1 <- data.table(a=1, b=2)
DT2 <- data.table(a=4, b=3)
DT_bindrows <- bind_rows(DT1,DT2)
DT_rbind <- rbind(DT1,DT2)
identical(DT_bindrows,DT_rbind)
 # [1] FALSE

目视检查 bind_rows() 和 rbind() 的结果表明它们确实是相同的。我读了thisthis(我从那里改编了这个例子)。我的问题:(a)我缺少什么,以及(b)如果我的列的数量、名称和顺序相同,我是否应该担心相同()= FALSE?

【问题讨论】:

    标签: r dplyr data.table rbind


    【解决方案1】:

    identical 检查不一样的attributes。使用all.equal,可以选择不检查属性(check.attributes

    all.equal(DT_bindrows, DT_rbind, check.attributes = FALSE)
    #[1] TRUE
    

    如果我们检查两个数据集的str,就会清楚

    str(DT_bindrows)
    #Classes ‘data.table’ and 'data.frame': 2 obs. of  2 #variables:
    # $ a: num  1 4
    # $ b: num  2 3
    str(DT_rbind)
    #Classes ‘data.table’ and 'data.frame': 2 obs. of  2 #variables:
    # $ a: num  1 4
    # $ b: num  2 3
    # - attr(*, ".internal.selfref")=<externalptr> # reference attribute 
    

    通过将属性分配为 NULL,identical 返回TRUE

    attr(DT_rbind, ".internal.selfref") <- NULL
    identical(DT_bindrows, DT_rbind)
    #[1] TRUE
    

    【讨论】:

    • 我不知道 all.equal() - 除此之外还有很多!谢谢你解释得这么好。
    • @armipunk 仅供参考,如果没有该属性,它可能无法正常运行 data.table。例如,试试bind_rows(DT1,DT2)[, gah := 11],它在我的系统上会给出关于缺少属性的警告。除非通过 dtplyr 中的 data.table 方法支持,否则最好不要执行 bind_rows,我猜 github.com/hadley/dtplyr
    • @Frank 谢谢 - 到目前为止,我一直坚持使用 data.table 函数,但当我开始把事情搞混时,很高兴知道这一点。
    猜你喜欢
    • 2016-04-10
    • 2017-08-10
    • 1970-01-01
    • 2014-08-11
    • 1970-01-01
    • 1970-01-01
    • 2012-09-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多