我刚开始使用R,并且遇到了data.table。我发现它很棒。
一个非常幼稚的问题:我可以忽略data.frame来使用data.table以避免两个软件包之间的语法混淆吗?
我刚开始使用R,并且遇到了data.table。我发现它很棒。
一个非常幼稚的问题:我可以忽略data.frame来使用data.table以避免两个软件包之间的语法混淆吗?
data.frame必须使用的东西吗?
Answers:
正如FAQ 1.1强调的那样,
jin[.data.table与jin有着根本的不同[.data.frame。甚至简单的操作DF[,1]也会破坏许多程序包和用户代码中的现有代码。这是设计使然,我们希望它能以这种方式工作,以使更复杂的语法起作用。也有其他区别(请参阅常见问题解答2.17)。此外,
data.table继承自data.frame。它也是一个data.frame。data.table可以将A传递给仅接受的任何包,data.frame并且该包可以[.data.frame在上使用语法data.table。我们还建议尽可能增强R。其中一个被R 2.12.0接受为新功能:
unique()而match()现在快上,所有的元素都在全球特征向量CHARSXP缓存并具有无标记的编码(ASCII)。感谢Matthew Dowle建议改进unique.c语言中生成哈希码的方式。第二个建议是使用
memcpy在duplicate.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,但在中不是可选的DFDT[[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)]返回NA行NADT[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.frame但FALSE在data.table中。stringsAsFactors默认情况下TRUE在data.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为了避免此类问题,将不断对其进行维护,因此可能出现的任何问题都将得到及时修复。
例如
从1.8.2版的NEWS
- base :: unname(DT)现在可以再次工作,如plyr :: melt()所需要。感谢Christoph Jaeckel的报告。测试已添加。
- 为ITime添加了一个as.data.frame方法,以便可以将ITime正确无误地传递给ggplot2#1713。感谢Farrel Buchinsky的报告。测试已添加。ITime轴标签从午夜起仍显示为整数秒;我们不知道为什么ggplot2不调用ITime的as.character方法。一种方法是将ITime转换为ggplot2的POSIXct。