我有一个已经使用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由运行函数保持不变?
答案 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)
我认为这很清楚。但我会尝试提供更清晰的信息。此外,我还尝试在文档中添加如何最好地使用这些功能。