【问题标题】:Convert a data.table to a data frame without copying [duplicate]将data.table转换为数据框而不复制[重复]
【发布时间】:2014-09-21 02:34:37
【问题描述】:

This question and answer set 询问如何在不复制的情况下将 data.frame 转换为 data.table,并展示了如何使用手动方法和出色的 setDT() 函数来实现。

如何在不复制的情况下安全地将 data.table 转换回 数据框?问题和推理类似于上面链接的问题。

【问题讨论】:

  • 我认为有一个 setDF 函数即将出现。
  • 正如 Ananda 所指出的,这已在 1.9.3 中实现。但我不明白其中的道理。您能否详细说明为什么要返回 data.frame?
  • @Arun 有些人不喜欢data.table 语法但喜欢fread 速度
  • 如果他们的数据足够大,可以从fread 中受益,我想他们会从data.table 的速度语法中受益更多.我只是鼓励人们 read the >100 independent reviews on crantastic 并自己尝试一下,然后再根据非手的 cmets 做出决定。
  • data.table-objects 继承 data.frame-class。如果你用这样的对象输入class(DT),你应该得到[1] "data.table", "data.frame",所以真的没有必要这样做。

标签: r data.table


【解决方案1】:

由于上面 cmets 中列出的所有原因,我认为这是一个完全错误的想法,而且可能是我不知道的原因,但是您可以将 [.data.table 函数替换为 [data.frame。这将防止@Arun 提出的关于需要为[-function 使用额外参数的问题:

 assignInNamespace( "[.data.table", getAnywhere( `[.data.frame`), ns="data.table") 

由于继承,所有通常检查“data.frame”类的函数都已经正常工作了。

编辑:Arun 的评论提供了一种不那么激烈的方法,因为重写核心 data.table '['-function 本质上是“不诚实的”。我想更诚实的方法是卸载整个 NAMESPACE。如果目标只是使用fread,我想知道是否可以只导入该函数和任何依赖项。

 setattr(DT, 'class', 'data.frame')

但仍将此视为“倒退”。

【讨论】:

  • 为什么这是一个倒退?仅仅因为它没有使用data.table?你可以在上面看到我为什么要这样做的评论。
  • 好的,在您不打算进一步做任何事情的特定上下文中,这可能不是一个坏主意。 setattr 是否为您解决问题?
  • 在最近的版本中,setDF 是要走的路。
猜你喜欢
  • 2013-12-19
  • 2020-08-07
  • 2017-03-02
  • 2018-09-22
  • 2016-03-23
  • 2020-10-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多