你可以用data.frame做什么,你不能使用data.table?

时间:2012-11-29 03:46:19

标签: r dataframe data.table

我刚开始使用R,遇到了data.table。我发现它很棒。

一个非常天真的问题:我可以忽略data.frame来使用data.table来避免两个包之间的语法混淆吗?

1 个答案:

答案 0 :(得分:61)

来自data.table FAQ

常见问题解答1.8好的,我开始看到data.table是什么,但为什么不在R中增强data.frame?为什么它必须是一个新的包?

  

正如常见问题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

2.17 data.frame和data.table之间的语法差异有哪些?

  
      
  • 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 FALSEdata.table stringsAsFactors为方便起见。
  •   默认情况下,
  • data.framedata.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}}一直在维护以避免此类问题,可能会出现的任何问题都会立即修复

例如

  
      
  • 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,是一种方法。
  •