我刚开始使用R,并且遇到了data.table。我发现它很棒。
一个非常幼稚的问题:我可以忽略data.frame来使用data.table以避免两个软件包之间的语法混淆吗?
我刚开始使用R,并且遇到了data.table。我发现它很棒。
一个非常幼稚的问题:我可以忽略data.frame来使用data.table以避免两个软件包之间的语法混淆吗?
data.frame
必须使用的东西吗?
Answers:
正如FAQ 1.1强调的那样,
j
in[.data.table
与j
in有着根本的不同[.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
,但在中不是可选的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)]
将NA
as视为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创建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。