我刚开始用 R,然后发现了 data.table 我觉得它很棒。
一个非常幼稚的问题: 我是否可以忽略 data.frame 而使用 data.table 来避免两个包之间的语法混淆?
来自 资料表常见问题
正如 FAQ 1.1强调的那样,[.data.table中的 j从根本上说是 不同于 [.data.frame中的 j。即使像 DF[,1]会破坏许多包和用户代码中的现有代码。 这是设计好的,我们希望它以这种方式工作更多 复杂的语法工作。还有其他的差异,也(见常见问题解答 2.17). 此外,data.table继承自 data.frame data.table也可以传递给任何包 只接受 data.frame,该包可以使用 [.data.frame data.table上的语法。 我们也尽可能地提出了 R 的增强 这些被接受为 R 2.12.0的一个新特性: unique()和 match()现在在字符向量上更快,其中所有元素都在全局 CHARSXP缓存中并且没有标记 编码(ASCII)。感谢 Matthew Dowle 的改进建议 在 unique.c 中生成哈希代码的方式。 第二个建议是在 duplicate.c中使用 memcpy,这非常重要 比 C 中的 for 循环更快。这将改进 R 的复制方式 内部数据(在某些度量值上增加13倍) 在这里: http://tolstoy.newcastle.edu.au/R/e10/devel/10/04/0148.html。
正如 FAQ 1.1强调的那样,[.data.table中的 j从根本上说是 不同于 [.data.frame中的 j。即使像 DF[,1]会破坏许多包和用户代码中的现有代码。 这是设计好的,我们希望它以这种方式工作更多 复杂的语法工作。还有其他的差异,也(见常见问题解答 2.17).
[.data.table
j
[.data.frame
DF[,1]
此外,data.table继承自 data.frame data.table也可以传递给任何包 只接受 data.frame,该包可以使用 [.data.frame data.table上的语法。
data.table
data.frame
我们也尽可能地提出了 R 的增强 这些被接受为 R 2.12.0的一个新特性:
unique()和 match()现在在字符向量上更快,其中所有元素都在全局 CHARSXP缓存中并且没有标记 编码(ASCII)。感谢 Matthew Dowle 的改进建议 在 unique.c 中生成哈希代码的方式。
unique()
match()
CHARSXP
unique.
第二个建议是在 duplicate.c中使用 memcpy,这非常重要 比 C 中的 for 循环更快。这将改进 R 的复制方式 内部数据(在某些度量值上增加13倍) 在这里: http://tolstoy.newcastle.edu.au/R/e10/devel/10/04/0148.html。
duplicate.c
memcpy
DT[3]指的是第三个 划船,而 DF[3]指的是第三个 专栏 但是 DF[ , 3] == DF[3](在 data.frame 中有些混淆,而 data.table 是一致的) 由于这个原因,我们在 DT中说逗号是 可以选择,但在 DF中不是可选的 DT[[3]] == DF[, 3] == DF[[3]] DT[i, ],其中 i是一个单一整数,返回一个单一行,就像 DF[i, ]一样,但不同于返回向量的矩阵单行子集。 其中 j为单个整数的 DT[ , j]返回一个单列 data.table,不像 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]返回 NA的1行,但是 DF[NA]返回包含 NA的整个 DF副本。符号 NA是 R 中的 logical类型,因此由 [.data.frame回收。用户的意图可能是 DF[NA_integer_]。为了方便起见,[.data.table会自动转向这个可能的意图。 DT[c(TRUE, NA, FALSE)]将 NA视为 FALSE,但 DF[c(TRUE, NA, FALSE)]返回 每个 NA的行 DT[ColA == ColB]比 DF[!is.na(ColA) & !is.na(ColB) & ColA == ColB, ]简单 Table 创建一个 list列。 为方便起见,check.names在 data.frame中默认为 TRUE,而在 data.table 中为 FALSE。 为了提高效率,stringsAsFactors在 data.frame中默认为 TRUE,而在 data.table 中为 FALSE。由于向 R 添加了全局字符串缓存,因此字符项是指向单个缓存字符串的指针,因此不再有转换到 factor的性能优势。 在 data.frame中使用 ", "打印时,list列中的原子向量会折叠,但是在 data.table 中使用 ",",并在第6项后面加一个逗号,以避免意外打印大型嵌入对象。 在 [.data.frame中,我们经常设置 drop = FALSE。当我们忘记,错误可能出现在边缘情况下,单列被选择,并突然返回一个向量,而不是单列 data.frame。在 [.data.table中,我们利用这个机会使其保持一致,并放弃了 drop。 当一个 data.table 被传递给一个 data.table 无意识的包时,该包并不关心这些差异; 它只是工作。
DT[3]
DF[3]
DF[ , 3] == DF[3]
DT
DF
DT[[3]] == DF[, 3] == DF[[3]]
DT[i, ]
i
DF[i, ]
DT[ , j]
DF[, j]
DT[ , "colA"][[1]] == DF[ , "colA"]
DT[ , colA] == DF[ , "colA"]
DT[ , list(colA)] == DF[ , "colA", drop = FALSE]
DT[NA]
NA
DF[NA]
logical
DF[NA_integer_]
DT[c(TRUE, NA, FALSE)]
FALSE
DF[c(TRUE, NA, FALSE)]
DT[ColA == ColB]
DF[!is.na(ColA) & !is.na(ColB) & ColA == ColB, ]
list
check.names
TRUE
stringsAsFactors
factor
", "
","
drop = FALSE
drop
可能会有这样的情况,一些包使用的代码在给定一个 data.frame 时会掉下来,但是,考虑到 data.table一直在被维护以避免这样的问题,任何可能出现的问题都会被及时修复。
比如说
看到这个问题并及时回答
来自1.8.2版本的新闻
Base: : unname (DT)现在可以工作了,这是 plyr: : melt ()所需要的 Christoph Jaeckel 报告,加入测试。 为 ITime 添加了一个 as.data.frame 方法,这样可以将 ITime 传递给 ggplot2 没有错误,# 1713。感谢 Farrel Buchinsky 的报道。测试添加。 从午夜开始,ITime 轴标签仍然显示为整数秒; 我们不知道为什么是 ggplot2 对于 ggplot2,将 ITime 转换为 POSIXct 是一种方法。