data.table的包装函数

时间:2014-10-21 01:09:39

标签: r data.table

我有一个已经使用data.frame上下文编写的项目。为了改善计算时间,我试图利用data.table的速度来代替。我的方法是构建包装函数,读取框架,将它们转换为表格,进行计算,然后转换回框架。这是一个简单的例子......

FastAgg<-function(x, FUN, aggFields, byFields = NULL, ...){
  require('data.table')
  y<-setDT(x)
  y<-y[,lapply(X=.SD,FUN=FUN,...),.SDcols = aggFields,by=byFields]
  y<-data.frame(y)
  y
}

我遇到的问题是在运行此函数后x已转换为表格,然后我使用data.frame表示法编写的代码行失败。如何确保我输入的data.frame由运行函数保持不变?

1 个答案:

答案 0 :(得分:3)

对于您的情况,我建议(当然)使用data.table,而不仅仅是在函数中: - )。

但如果不太可能发生,那么我建议setDT + setDF设置。我建议在函数外部使用setDT(并提供data.table作为输入) - 通过引用将data.frame转换为data.table,然后在完成操作后使用{ d,你可以使用setDF使用setDF将结果转换回data.frame并从函数返回。但是,setDT(x)x更改为data.table - 因为它通过引用进行操作。

如果这不理想,请在函数内部使用as.data.table(.),因为它在副本上运行。然后,您仍然可以使用setDF()将生成的data.table转换为data.frame并从函数中返回该data.frame。

最近推出了这些功能(主要是由于用户请求)。避免这种混淆的想法是导出shallow()函数并跟踪需要复制列的对象,并在内部(并自动)完成所有操作。它现在都处于非常早期的阶段。在我们管理完毕后,我会更新此帖子。


另请查看?copy?setDT?setDF。这些功能的帮助页面中的第一段是:

  

data.table用语中,所有set*函数都通过引用更改其输入。也就是说,除了临时工作内存之外,根本没有复制,只有一列。通过引用修改输入的唯一其他data.table运算符是:=。请查看下面的See Also部分,了解其他set*功能数据。表格提供。

setDT的示例:

set.seed(45L)
X = data.frame(A=sample(3, 10, TRUE), 
         B=sample(letters[1:3], 10, TRUE), 
         C=sample(10), stringsAsFactors=FALSE)

# get the frequency of each "A,B" combination
setDT(X)[, .N, by="A,B"][]

没有任务(虽然我承认在这里可以稍微解释一下)。

setDF

X = data.table(x=1:5, y=6:10)
## convert 'X' to data.frame, without any copy.
setDF(X)

我认为这很清楚。但我会尝试提供更清晰的信息。此外,我还尝试在文档中添加如何最好地使用这些功能。