你可以用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.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.tabledata.frame默认为TRUE ,而在data.table中为FALSE
  • stringsAsFactorsdata.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是一种方法。