你可以用data.frame做什么,你不能在data.table中
我刚开始使用R,碰到data.table。 我发现它辉煌。
一个非常天真的问题:我可以忽略data.frame使用data.table来避免两个包之间的语法混淆?
从data.table常见问题
FAQ 1.8 OK,我开始看到data.table是关于什么的,但是为什么你没有在R中增强data.frame呢? 为什么它必须是一个新的包?
正如FAQ 1.1所强调的那样,
[.data.table中的j与[.data.framej根本不同。 即使像DF[,1]那样简单的东西也会破坏很多包和用户代码中的现有代码。 这是通过devise,我们希望它以这种方式工作更复杂的语法。 还有其他的不同之处(见FAQ 2.17)。而且,
data.tableinheritance自data.frame。 这也是一个数据data.frame。 一个data.table可以传递给任何只接受data.frame包,并且该包可以在data.table上使用[.data.frame语法。我们也尽可能地提出了对R的改进。 其中之一被接受为R 2.12.0中的一个新特性:
在所有元素位于全局
CHARSXP高速caching中且具有未标记编码(ASCII)的字符向量上,unique()和match()现在更快。 感谢Matthew Dowlebuild议改进散列码的unique.生成方式unique.C。第二个提议是在
duplicate.c使用memcpy,这比在C中的for循环快得多。这将改进R在内部复制数据的方式(在某些度量上是13倍)。 r-devel上的线程在这里: http : //tolstoy.newcastle.edu.au/R/e10/devel/10/04/0148.html 。
2.17 data.frame和data.table有什么小的语法差异?
DT[3]指第3行,DF[3]指第3列
DT[3,] == DT[3],但DF[,3] == DF[3](有点令人困惑)- 出于这个原因,我们说逗号在DT中是可选的,但在DF中不可选
DT[[3]] == DF[3] == DF[[3]]
DT[i,]其中i是单个整数,返回单个行,就像DF[i,],但与matrix单行子集不同,它返回一个向量。
DT[,j,with=FALSE]其中j是一个整数返回一列data.table,不像DF[,j]默认返回一个向量
DT[,"colA",with=FALSE][[1]] == DF[,"colA"]。
DT[,colA] == DF[,"colA"]
DT[,list(colA)] == DF[,"colA",drop=FALSE]
DT[NA]返回DT[NA]1行,但是DF[NA]始终返回包含NA的DF的副本。- 符号
NA在R中是逻辑types的,因此由[.data.frame。 意图可能是DF[NA_integer_]。[.data.table自动执行此操作以方便使用。
DT[c(TRUE,NA,FALSE)]将NA视为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))创build3列,data.table创build一个列表列。- 为了方便,
data.table在data.frame默认为TRUE,而在data.table中为FALSE。
stringsAsFactors在data.frame默认为TRUE,但在data.table中为FALSE,以提高效率。- 由于将全局stringcaching添加到R,因此字符项是指向单个cachingstring的指针,并且不再具有转换因子的性能优势。
- 列表列中的primefaces向量在data.frame中使用“,”打印时折叠,而在第6个项目后使用尾随逗号分隔data.table中的“,”以避免意外打印大型embedded对象。
- 在
[.data.frame我们经常设置drop=FALSE。 当我们忘记时,在select单个列的边缘情况下可能出现错误,并且所有突然返回的向量而不是单个列data.frame。 在[.data.table我们借此机会使其一致并且下降。- 当一个data.table传递给一个data.table-unaware包时,它不关心这些差异; 它只是工作
小警告
 可能会出现这样的情况:某些软件包使用的代码在给定data.frame时会崩溃,但是,为了避免这种问题, data.table会一直保持不变,任何可能出现的问题都会被及时修复。 
例如
- 
看到这个问题和迅速的回应 
- 
来自v 1.8.2的NEWS 
- base :: unname(DT)现在再次工作,由plyr :: melt()需要。 感谢Christoph Jaeckel的报告。 testing添加。
- 为ITime添加了一个as.data.frame方法,以便ITime可以无错地传递给ggplot2,#1713。 感谢Farrel Buchinsky报告。 添加了testing。 ITime轴标签仍然显示为从午夜起的整数秒; 我们不知道为什么ggplot2不会调用ITime的as.character方法。 将ITime转换为ggplot2的POSIXct是一种方法。