【问题标题】:Why is this difference between order and setorder(v) by data.table?为什么 data.table 的 order 和 setorder(v) 之间存在这种差异?
【发布时间】:2019-10-01 09:31:21
【问题描述】:

我想订购一个 data.table。使用 setorder(v) 我会收到与使用 base::order 不同的结果。我怎么能收到相同的结果,订单?

我已经尝试使用 1 列来解决,但我应该按更多列排序。

1: (test = data.table(V1 = c("TeilA1_a", "TeilA_a", "TeilC1_a", "TeilA_a"), 
                      V2 = c("4", "3", "2", "1")))
 2:   test[order(V1)]
 3:   sort(test[[1]])
 4:   c(order(test[[1]]))
 5:   order(test[[1]])
 6:   test[c(order(test[[1]]))]
 7:   test[order(test[[1]])]
 8:   (setorderv(test, c("V1"), c(1)))
 9:   test[order(V1)]
10:  test[order(V1, V2)]

为什么c(4,5) 行的结果相同,而c(6,7) 则不同?我希望第 8 行的输出与第 6 行相同。

【问题讨论】:

    标签: r data.table


    【解决方案1】:

    来自?setorder(data.table_1.12.2):

    另请注意,data.table 总是在“C 语言环境”中重新排序(请参阅详细信息)。要按会话区域设置排序,请使用 x[base::order(.)]。

    更多细节

    data.table 总是在“C 语言环境”中重新排序。因此,排序可能与通过 base::order 获得的不同。例如,在英语语言环境中,排序在 C 语言环境中区分大小写。因此,排序 c("c", "a", "B") 在 data.table 中返回 c("B", "a", "c") 但 c("a", "B", "c" ) 在 base::order 中。请注意,这在大多数数据情况下没有区别;对于只有大写或小写字母的 id(“AB123”

    感谢 Frank,注意到当订单优化开启时,order 在内部被 data.table:::forder 替换,而 test[(order(V1))]; test[c(order(V1))]; test[base::order(V1)] 没有,而是从 [ 之外的范围内检索。

    还要感谢 MichaelChirico,从 data.table_1.12.4 开始,test[c(order(V1))]; test[(order(V1))] 将默认为 data.table:::forder。请查看NEWS 以获取更新。

    因此,test[order(V1), verbose=TRUE] 按 C-locale 排序(就像 test[data.table::chorder(V1)])给出

    #data.table_1.12.2
    order optimisation is on, i changed from 'order(...)' to 'forder(DT, ...)'.
       rn       V1 V2
    1:  1 TeilA1_a  4
    2:  2  TeilA_a  3
    3:  4  TeilA_a  1
    4:  3 TeilC1_a  2
    

    test[base::order(V1)]; test[(order(V1)), verbose=TRUE]; test[c(order(V1)), verbose=TRUE] 给了

       rn       V1 V2
    1:  2  TeilA_a  3
    2:  4  TeilA_a  1
    3:  1 TeilA1_a  4
    4:  3 TeilC1_a  2
    

    数据:

    library(data.table)
    test = data.table(rn=1:4, V1 = c("TeilA1_a", "TeilA_a", "TeilC1_a", "TeilA_a"), V2 = c("4", "3", "2", "1"))
    

    【讨论】:

    • 也许值得注意的是,内部 data.table:::forder 被替换为 DT[order()],而 OP 似乎错误地认为它是 base::order 被使用。他们的 DT[c(order())] 只是通过绕过 data.table 对调用的解析来生成 base::order (它在其中查找 order 是顶级函数)。他们可以使用 verbose=TRUE 了解详细信息。
    • FWIW DT[c(order())] 还将在 data.table 的开发版本中使用 forder(以及从 1.12.4 开始)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-23
    • 2021-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多