【问题标题】:What you can do with a data.frame that you can't with a data.table?你可以用 data.frame 做什么而不能用 data.table 做什么?
【发布时间】:2012-11-17 02:18:17
【问题描述】:

我刚开始使用 R,遇到了 data.table。我发现它很棒。

一个很幼稚的问题:我可以忽略data.frame来使用data.table来避免两个包之间的语法混淆吗?

【问题讨论】:

  • 请参阅the data.table faq,特别是 1.8 和 2.17。在某些情况下,其他包可能会依赖一些奇怪的编码,但我还没有遇到任何情况(尚未修复)。
  • @mnel 我认为您的评论就是答案。
  • 所以这是 2.5 年前的事了...有没有人找到必须使用 data.frame 的东西??

标签: r dataframe data.table


【解决方案1】:

来自data.table FAQ

FAQ 1.8 好的,我开始了解 data.table 是关于什么的,但是你为什么不在 R 中增强 data.frame 呢?为什么它必须是一个新包?

作为 FAQ 1.1 的重点,[.data.table 中的 j 从根本上说是 与[.data.frame 中的j 不同。甚至像这样简单的事情 DF[,1] 会破坏许多包和用户代码中的现有代码。 这是设计使然,我们希望它以这种方式工作更多 复杂的语法工作。还有其他差异(请参阅常见问题解答 2.17)。

此外,data.table 继承自 data.frame。它是一个 data.frame 也是。 data.table 可以传递给任何包 只接受data.frame 并且该包可以使用[.data.frame data.table 的语法。

我们也尽可能地提出了对 R 的增强。之一 这些在 R 2.12.0 中被接受为新功能:

unique()match() 现在在所有元素都在全局 CHARSXP 缓存中且未标记的字符向量上更快 编码(ASCII)。感谢 Matthew Dowle 提出改进建议 unique.c 中生成哈希码的方式。

第二个建议是在duplicate.c 中使用memcpy,这很 比 C 中的 for 循环更快。这将改进 R 复制的方式 内部数据(在某些措施上是 13 倍)。 r-devel 上的线程 在这里:http://tolstoy.newcastle.edu.au/R/e10/devel/10/04/0148.html.

data.frame 和 data.table 之间较小的语法差异是什么

  • DT[3] 指的是第三,但DF[3] 指的是第三
  • DT[3, ] == DT[3],但 DF[ , 3] == DF[3](在 data.frame 中有些混乱,而 data.table 是一致的)
  • 因此,我们说逗号在DT 中是可选,但在DF 中不是可选的
  • DT[[3]] == DF[, 3] == DF[[3]]
  • DT[i, ],其中i 是单个整数,返回单行,就像DF[i, ],但不同于返回向量的矩阵单行子集。
  • DT[ , j] 其中j 是一个整数,返回一个单列的data.table,不像DF[, j] 默认返回一个向量
  • DT[ , "colA"][[1]] == DF[ , "colA"].
  • DT[ , colA] == DF[ , "colA"](目前在 data.table v1.9.8 中,但即将更改,请参阅发行说明)
  • DT[ , list(colA)] == DF[ , "colA", drop = FALSE]
  • DT[NA] 返回 1 行 NA,但 DF[NA] 返回整个包含 NADF 副本。符号NA 是R 中的logical 类型,因此被[.data.frame 回收。用户的意图可能是DF[NA_integer_]。为方便起见,[.data.table 会自动转向这个可能的意图。
  • DT[c(TRUE, NA, FALSE)]NA 视为 FALSE,但 DF[c(TRUE, NA, FALSE)] 返回 NA 每个 NA 的行
  • DT[ColA == ColB]DF[!is.na(ColA) & !is.na(ColB) & ColA == ColB, ] 简单
  • data.frame(list(1:2, "k", 1:4)) 创建 3 个列,data.table 创建一个 list 列。
  • 为方便起见,check.namesdata.frame 中默认为TRUE,但在data.table 中为FALSE
  • stringsAsFactorsdata.frame 中默认为TRUE,但在data.table 中为FALSE,以提高效率。由于在 R 中添加了全局字符串缓存,字符项是指向单个缓存字符串的指针,转换为 factor 不再具有性能优势。
  • list 列中的原子向量在使用data.frame 中的", " 打印时会折叠,但在data.table 中"," 在第6 项之后使用逗号结尾以避免意外打印大型嵌入对象。 在[.data.frame 中,我们经常设置drop = FALSE。当我们忘记时,在选择单列并且突然返回向量而不是单列data.frame 的极端情况下可能会出现错误。在[.data.table 中,我们借此机会使其保持一致并删除了drop。 当 data.table 传递给 data.table-unaware 包时,该包不关心这些差异;它只是工作。

小警告

在某些情况下,某些包使用的代码在给定 data.frame 时可能会崩溃,但是,鉴于 data.table 一直在维护以避免此类问题,因此可能出现的任何问题都会及时修复。

例如

  • base::unname(DT) 现在可以根据 plyr::melt() 的需要再次工作。谢谢 Christoph Jaeckel 进行报道。添加了测试。
  • 为 ITime 添加了 as.data.frame 方法,以便可以将 ITime 传递给 ggplot2 没有错误,#1713。感谢 Farrel Buchinsky 的报道。添加了测试。 ITime 轴标签仍显示为从午夜开始的整数秒;我们不知道为什么 ggplot2 不调用 ITime 的 as.character 方法。为 ggplot2 将 ITime 转换为 POSIXct 是一种方法。

【讨论】:

  • 就我对什么是-a 的理解而言,代码破坏语义差异意味着说data.table 是一个data.frame,只会让我感到困惑。使用其中一个的代码需要在正确使用另一个之前进行编辑。
猜你喜欢
  • 2020-07-09
  • 1970-01-01
  • 2021-03-18
  • 1970-01-01
  • 2011-08-23
  • 1970-01-01
  • 2013-03-11
  • 2018-05-30
  • 1970-01-01
相关资源
最近更新 更多