【问题标题】:data.table::setorder changes underlying variablesdata.table::setorder 改变底层变量
【发布时间】:2018-02-27 16:30:44
【问题描述】:

我注意到setorder 似乎改变了它根本不应该触及的变量。一个简单的代码示例最好地说明了这一点:

library(data.table)
x <- 1:3
y <- 3:1
data <- data.frame(x.dat=x, y.dat=y)
setorder(data, y.dat)
x

变量 x 已重新排序,现在也显示为 3 2 1 。对我来说,这看起来像是 setorder 命令中的一个错误。 如果在数据框定义和setorder之间插入一些额外的修改x的命令,效果就会消失。

编辑:我只是重新运行代码,效果就消失了。从现在到一年前我的第一篇文章,这个问题似乎已经解决了。特别是1.10。 data.table 的版本有效果,在 1.11.8 中它可以正常工作。

【问题讨论】:

  • 是的,我同意这是一种奇怪的行为,x 不应通过在 data 上运行 setorder 来重新排序。
  • 如果在data.table 上使用setorderx 的顺序不会改变:data &lt;- data.table(x.dat = x, y.dat = y); setorder(data, y.dat); x
  • 如果我们在setorder 的开头插入一行if (!is.data.table(x)) x = copy(x),这个问题就会消失,支持这种行为可能与 setorder 是通过引用对 x 操作还是对x.
  • 无法复制。

标签: r sorting dataframe data.table


【解决方案1】:

是的,datatable.setorder 与所有 set* 函数一样,按引用对表进行排序,data.frame 只是对列的引用的集合。请参阅R documentation。对表进行排序当然意味着对表的所有列进行排序,因此列得到排序。

【讨论】:

    【解决方案2】:

    我只是重新运行代码,效果就消失了。从现在到一年前我的第一篇文章,这个问题似乎已经解决了。特别是1.10。 data.table 的版本有效果,在 1.11.8 中它可以正常工作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-02-07
      • 1970-01-01
      • 2014-03-15
      • 1970-01-01
      • 1970-01-01
      • 2022-01-11
      • 2016-05-24
      相关资源
      最近更新 更多