你能用 data.frame 做什么而不能用 data.table?

我刚开始用 R,然后发现了 data.table 我觉得它很棒。

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

23228 次浏览

来自 资料表常见问题

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.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倍) 在这里: http://tolstoy.newcastle.edu.au/R/e10/devel/10/04/0148.html

data.frame和 data.table 之间的语法差异有哪些

  • DT[3]指的是第三个 划船,而 DF[3]指的是第三个 专栏
  • 但是 DF[ , 3] == DF[3](在 data.frame 中有些混淆,而 data.table 是一致的)
  • 由于这个原因,我们在 DT中说逗号是 可以选择,但在 DF中不是可选的
  • DT[[3]] == DF[, 3] == DF[[3]]
  • DT[i, ],其中 i是一个单一整数,返回一个单一行,就像 DF[i, ]一样,但不同于返回向量的矩阵单行子集。
  • 其中 j为单个整数的 DT[ , 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]返回 NA的1行,但是 DF[NA]返回包含 NA的整个 DF副本。符号 NA是 R 中的 logical类型,因此由 [.data.frame回收。用户的意图可能是 DF[NA_integer_]。为了方便起见,[.data.table会自动转向这个可能的意图。
  • DT[c(TRUE, NA, FALSE)]NA视为 FALSE,但 DF[c(TRUE, NA, FALSE)]返回 每个 NA的行
  • DT[ColA == ColB]DF[!is.na(ColA) & !is.na(ColB) & ColA == ColB, ]简单
  • Table 创建一个 list列。
  • 为方便起见,check.namesdata.frame中默认为 TRUE,而在 data.table 中为 FALSE
  • 为了提高效率,stringsAsFactorsdata.frame中默认为 TRUE,而在 data.table 中为 FALSE。由于向 R 添加了全局字符串缓存,因此字符项是指向单个缓存字符串的指针,因此不再有转换到 factor的性能优势。
  • data.frame中使用 ", "打印时,list列中的原子向量会折叠,但是在 data.table 中使用 ",",并在第6项后面加一个逗号,以避免意外打印大型嵌入对象。 在 [.data.frame中,我们经常设置 drop = FALSE。当我们忘记,错误可能出现在边缘情况下,单列被选择,并突然返回一个向量,而不是单列 data.frame。在 [.data.table中,我们利用这个机会使其保持一致,并放弃了 drop。 当一个 data.table 被传递给一个 data.table 无意识的包时,该包并不关心这些差异; 它只是工作。

小小的警告

可能会有这样的情况,一些包使用的代码在给定一个 data.frame 时会掉下来,但是,考虑到 data.table一直在被维护以避免这样的问题,任何可能出现的问题都会被及时修复。

比如说

  • Base: : unname (DT)现在可以工作了,这是 plyr: : melt ()所需要的 Christoph Jaeckel 报告,加入测试。
  • 为 ITime 添加了一个 as.data.frame 方法,这样可以将 ITime 传递给 ggplot2 没有错误,# 1713。感谢 Farrel Buchinsky 的报道。测试添加。 从午夜开始,ITime 轴标签仍然显示为整数秒; 我们不知道为什么是 ggplot2 对于 ggplot2,将 ITime 转换为 POSIXct 是一种方法。