我刚开始使用R,遇到了data.table。我发现它很棒。
一个非常天真的问题:我可以忽略data.frame来使用data.table来避免两个包之间的语法混淆吗?
答案 0 :(得分:61)
正如常见问题1.1所述,
j
中[.data.table
基本上是j
与[.data.frame
中的DF[,1]
不同。即使是简单的事情data.table
会破坏许多包和用户代码中的现有代码。 这是设计的,我们希望它以这种方式工作以获得更多 复杂的语法工作。还有其他差异(请参阅常见问题解答 2.17)。此外,
data.frame
继承自data.frame
。它是一个data.table
也是。data.frame
可以传递给任何包 只接受[.data.frame
,该套餐可以使用data.table
unique()
上的语法。我们也尽可能地提议对R进行增强。之一 这些被认为是R 2.12.0中的新功能:
中生成哈希码的方式
match()
和CHARSXP
现在在字符向量上更快,其中所有元素都在全局unique.
缓存中并且没有标记 编码(ASCII)。感谢Matthew Dowle提出改进建议 在memcpy
c。第二个提案是在
duplicate.c
中使用DT[3]
,这很多 比C中的for循环更快。这将改进R复制的方式 内部数据(有些措施是13次)。 r-devel上的线程 在这里:http://tolstoy.newcastle.edu.au/R/e10/devel/10/04/0148.html。
DF[3]
指的是第3行,但DT[3,] == DT[3],
指的是第3列DF[,3] == DF[3]
但DT[[3]] == DF[3] == DF[[3]]
(有点令人困惑)- 因此我们说逗号在DT中是可选的,但在DF
中不是可选的DT[i,]
DF[i,]
其中i是单个整数,返回单行,就像DT[,j,with=FALSE]
一样,但不像矩阵单行子集返回一个 矢量。DF[,j]
其中j是单个整数,返回一列data.table,与默认情况下返回向量的DT[,"colA",with=FALSE][[1]] == DF[,"colA"]
不同DT[,colA] == DF[,"colA"]
。DT[,list(colA)] == DF[,"colA",drop=FALSE]
DT[NA]
DF[NA]
返回1行NA,但NA
返回包含NA的DF副本。- 符号
[.data.frame
在R中是逻辑类型,因此由DF[NA_integer_]
回收。意图可能是[.data.table
。 为方便起见,DT[c(TRUE,NA,FALSE)]
会自动执行此操作。DF[c(TRUE,NA,FALSE)]
将NA视为FALSE,但NA
返回NA行
每个DT[ColA==ColB]
- 更简单
DF[!is.na(ColA) & !is.na(ColB) & ColA==ColB,]
比data.frame(list(1:2,"k",1:4))
data.table
创建3列,check.names
创建一个列表列。- 默认情况下,
TRUE
默认为data.frame
FALSE
,data.table
stringsAsFactors
为方便起见。data.frame
在data.table
中为TRUE,在[.data.frame
中为{FALSE},以提高效率。- 由于全局字符串缓存已添加到R,因此字符项是指向单个缓存字符串的指针,并且不再存在 转换为因素的性能优势。
- 列表列中的原子向量在data.frame中使用“,”打印时折叠,但在data.table中使用后面的逗号表示“,” 第6项,以避免意外打印大型嵌入物。
- 在
drop=FALSE
我们经常设置[.data.table
。当我们忘记时,在选择单列的所有边缘情况下都会出现错误 突然返回一个向量而不是单个列 data.frame。在data.table
我们抓住机会成功 持续下降。- 当data.table传递给data.table-unaware包时,该包不关心任何这些差异;它只是工作
可能会出现某些软件包使用代码在给定data.frame时崩溃的情况,但是,鉴于{{1}}一直在维护以避免此类问题,可能会出现的任何问题都会立即修复
例如
来自NEWS for v 1.8.2
- base :: unname(DT)现在再次工作,plyr :: melt()需要。谢谢 Christoph Jaeckel报道。测试补充。
- 为ITime添加了as.data.frame方法,以便可以将ITime传递给ggplot2 没有错误,#1713。感谢Farrel Buchinsky的报道。测试补充说。 ITime轴标签仍显示为午夜的整数秒;我们不知道为什么ggplot2 不会调用ITime的as.character方法。将ITime转换为POSIXct for ggplot2,是一种方法。