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

Ada*_*NYC 69 r dataframe data.table

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

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

Ama*_*nda 61

来自data.table常见问题

FAQ 1.8好的,我开始看到data.table是什么,但为什么你没有在R中增强data.frame?为什么它必须是一个新包装?

作为FAQ 1.1的亮点,j[.data.table从根本不同j[.data.frame.甚至像DF[,1]在许多包和用户代码中破坏现有代码一样简单 .这是设计使然,我们希望它以这种方式工作,以使更复杂的语法工作.还有其他差异(参见FAQ 2.17).

此外,data.table继承自data.frame.它也是一个 data.frame.A data.table可以传递给任何只接受的包,data.frame并且包可以使用[.data.frame 语法data.table.

我们也在可能的情况下提出了R的增强功能.其中一个被接受为R 2.12.0中的新功能:

unique()并且match()现在在字符向量上更快,其中所有元素都在全局CHARSXP高速缓存中并且具有未标记的编码(ASCII).感谢Matthew Dowle建议改进在unique.c中生成哈希码的方式.

第二个提议是使用memcpyin duplicate.c,这比C中的for循环要快得多.这将改进R在内部复制数据的方式(在某些度量上复制13次).r-devel上的帖子在这里:http://tolstoy.newcastle.edu.au/R/e10/devel/10/04/0148.html.

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

  • data.frame指的是第3行,但是DT[3]指的是第3列
  • DF[3]DT[3, ] == DT[3](有点令人困惑)
  • 出于这个原因,我们说逗号在DT中是可选的,但在DF中不是可选的
  • DF[ , 3] == DF[3]
  • DT其中i是单个整数,返回单行,就像DF,但不像返回向量的矩阵单行子集.
  • DT[[3]] == DF[, 3] == DF[[3]]其中j是单个整数,返回一列data.table,与之不同DT[i, ],默认情况下返回一个向量
  • i.
  • DF[i, ]
  • DT[ , j]
  • j返回1行NA,但DF[, j]返回包含NA的DF副本.
  • 该符号DT[ , "colA"][[1]] == DF[ , "colA"]在R中是逻辑类型,因此被回收DT[ , colA] == DF[ , "colA"].意图可能是DT[ , list(colA)] == DF[ , "colA", drop = FALSE]. DT[NA]这样做是为了方便起见.
  • NA将NA视为FALSE,但 为每个DF[NA]返回NA行
    DF
  • NA 比...更简单 NA
  • logical创建3列,[.data.frame创建一个列表列.
  • DF[NA_integer_]默认情况下[.data.tableDT[c(TRUE, NA, FALSE)],但NAFALSE,为了方便.
  • DF[c(TRUE, NA, FALSE)]为了提高效率,默认情况下为TRUE,NA但为FALSE NA.
  • 由于全局字符串缓存已添加到R,因此字符项是指向单个缓存字符串的指针,并且不再具有转换为因子的性能优势.
  • 列表列中的原子向量在data.frame中使用","打印时折叠,但在data.table中使用",",在第6项之后使用尾随逗号,以避免意外打印大型嵌入对象.
  • DT[ColA == ColB]我们经常设定DF[!is.na(ColA) & !is.na(ColB) & ColA == ColB, ].当我们忘记时,在选择单列并且突然返回向量而不是单个列data.frame的边缘情况下会出现错误.在data.frame(list(1:2, "k", 1:4))我们抓住机会使其保持一致和下降.
  • 当data.table传递给data.table-unaware包时,该包不关心任何这些差异; 它只是工作

小警告

可能存在这样的情况:某些软件包使用的代码在给定data.frame时会丢失,但是,考虑list到为了避免此类问题而不断维护,可能会出现的任何问题都会立即得到解决.

例如

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