你可以用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.frame
j
根本不同。 即使像DF[,1]
那样简单的东西也会破坏很多包和用户代码中的现有代码。 这是通过devise,我们希望它以这种方式工作更复杂的语法。 还有其他的不同之处(见FAQ 2.17)。而且,
data.table
inheritance自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是一种方法。