79

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

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

4

1 回答 1

67

来自data.table 常见问题

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

正如 FAQ 1.1 强调的那样,jin与in[.data.table根本不同。甚至像 破坏许多包和用户代码中的现有代码这样简单的事情。这是设计使然,我们希望它以这种方式工作,以便更复杂的语法工作。还有其他差异(参见常见问题解答 2.17)。j[.data.frameDF[,1]

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

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

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

第二个建议是使用memcpyin duplicate.c,它比 C 中的 for 循环快得多。这将改进 R 在内部复制数据的方式(在某些方面提高了 13 倍)。r-devel 的主题在这里:http ://tolstoy.newcastle.edu.au/R/e10/devel/10/04/0148.html 。

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

  • DT[3]指的是第 3,但DF[3]指的是第 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]的整个副本。该符号是 R 中的类型,因此被. 用户的意图大概是。为方便起见,它会自动转向这个可能的意图。DFNANAlogical[.data.frameDF[NA_integer_][.data.table
  • DT[c(TRUE, NA, FALSE)]NAas 视为FALSE,但为每个DF[c(TRUE, NA, FALSE)]返回 NANA
  • 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.names为方便起见,默认情况下在TRUEdata.table中。data.frameFALSE
  • stringsAsFactors默认情况下TRUEdata.frameFALSE在 data.table 中,以提高效率。由于将全局字符串缓存添加到 R 中,字符项是指向单个缓存字符串的指针,转换为factor.
  • 使用in打印时,列中的原子向量list会折叠,但在 data.table 中,在第 6 项之后带有尾随逗号,以避免意外打印大型嵌入对象。在我们很多时候设置。当我们忘记时,在选择单列并且突然返回向量而不是单列的极端情况下可能会出现错误。在我们借此机会使其保持一致并放弃。当一个 data.table 被传递给一个 data.table-unaware 包时,这个包不关心任何这些差异;它只是工作。", "data.frame","[.data.framedrop = FALSEdata.frame[.data.tabledrop

小警告

在某些情况下,某些包使用的代码在给定 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 是一种方法。
于 2012-11-29T21:58:22.783 回答