使用data.frame不能使用data.table做什么?


72

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

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


13
请参阅data.table常见问题解答,特别是1.8和2.17。在某些情况下,其他软件包可能会依赖一些奇怪的编码,但这些编码可能会掉下来,但我还没有遇到过(尚未修复)。
mnel 2012年

@mnel我认为您的评论就是答案。
布兰登·贝特尔森

2
所以这是2.5年前...有人找到了data.frame必须使用的东西吗?
MichaelChirico 2015年

Answers:


65

data.table常见问题解答

常见问题解答1.8好的,我开始看到有关data.table的内容,但是为什么不增强R中的data.frame?为什么必须是新包装?

正如FAQ 1.1强调的那样,jin[.data.tablejin有着根本的不同[.data.frame。甚至简单的操作 DF[,1]也会破坏许多程序包和用户代码中的现有代码。这是设计使然,我们希望它能以这种方式工作,以使更复杂的语法起作用。也有其他区别(请参阅常见问题解答2.17)。

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

我们还建议尽可能增强R。其中一个被R 2.12.0接受为新功能:

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

第二个建议是使用memcpyduplicate.c,这比快得多的用于C.此循环将改善的方式是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,一个整数返回一个单列数据。表与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]返回的整个副本DF含有NA贯穿。该符号在R中NA键入logical,因此由回收[.data.frame。用户的意图可能是DF[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创建1list列。
  • check.names为了方便起见,默认情况下TRUE位于data.table中,data.frameFALSE在data.table中。
  • stringsAsFactors默认情况下TRUEdata.frame,但FALSE在data.table,以提高效率。由于全局字符串缓存已添加到R中,因此字符项是指向单个缓存的字符串的指针,并且转换为不再具有性能优势factor
  • list使用", "in进行打印时,列中的原子向量会折叠data.frame,但","在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不调用ITime的as.character方法。一种方法是将ITime转换为ggplot2的POSIXct。
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.