【问题标题】:R setorder corrupts original data table 2 generations agoR setorder 破坏了 2 代前的原始数据表
【发布时间】:2022-12-01 07:06:35
【问题描述】:

这里发生了什么,设置顺序的应用导致原始选项卡具有列未排序,而其他列是,从而 corrputing 数据表?

library(data.table)
library(purrr)

colFun <- function(dt, cols, fun){
    for(col in cols){
        dt[[col]] <- dt[[col]] %>% fun()
    }
    # irrelevant manipulations
    return(dt)
}
topRows <- function(dt, n, ncol = 'N'){
    setorderv(dt, ncol, -1)
    # irrelevant manipulations
    return(dt[1:n,])
}


tab <- data.table(
    id = 1005:1001,
    N = 1:5+.01,
    X = c('E','D','C','B','A')
)
tab
#setkey(tab, id)
tab %>% colFun('N', round) %>% topRows(3)
tab

设置密钥时不会发生...

【问题讨论】:

标签: r data.table


【解决方案1】:

根据 data.table 的帮助菜单:

用 data.table 的说法,所有 set* 函数都通过以下方式更改其输入 参考。也就是说,除了临时副本外,根本没有副本 工作记忆,它和一列一样大。

此外,

如果 setorder 导致键控数据表的行重新排序, 然后它的键将被设置为 NULL。

我认为重新排序已经键入的 data.table 没有意义,因为通过设置键,您希望表按该键按升序排序。

当您致电setorderv时。它所做的只是对选定的列进行排序。在这种情况下N。然而,这里似乎发生的是因为 setkey 和 setorder 都是在 RAM 中完成的。 setorder 的浅拷贝无法确定原来用setkey 的排序机制。因此,setkey 被设置为 NULL 并导致一些非常奇怪的结果。

您可以通过直接将 dt 保存在函数环境中或在 setorder 之后再次调用 setkey 来避免这种情况。

topRows <- function(dt, n, ncol = 'N'){
    dt = setorderv(dt, ncol, -1)
    return(dt[1:n,])
}

# or

topRows <- function(dt, n, ncol = 'N'){
    setorderv(dt, ncol, -1)
    setkey(tab, id)
    return(dt[1:n,])
}

#      id N X
# 1: 1001 5 A
# 2: 1002 4 B
# 3: 1003 3 C

【讨论】:

    猜你喜欢
    • 2016-08-17
    • 1970-01-01
    • 1970-01-01
    • 2023-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-30
    • 1970-01-01
    相关资源
    最近更新 更多