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不受运行函数的影响?
对于你的情况,我建议(当然)通过使用data.table
,而不只是在一个函数:-)。
但如果不可能发生,那么我会推荐setDT
+ setDF
设置。 我建议在函数之外使用setDT
(并提供data.table作为输入) - 通过引用将data.frame转换为data.table,然后在完成所需的操作后,可以使用setDF
使用setDF
将结果转换回setDF
并从函数返回。 但是, setDT(x)
将x
更改为data.table - 因为它通过引用进行操作。
如果这不理想,那么在函数中使用as.data.table(.)
,因为它在副本上运行。 然后,您仍然可以使用setDF()
将结果data.table转换为data.frame并从函数返回该data.frame。
这些功能最近被引入(主要是由于用户请求)。 避免这种混淆的想法是导出shallow()
函数并跟踪需要复制列的对象,并在内部(和自动)完成所有操作。 这一切都在很早的阶段。 当我们管理好后,我会更新这篇文章。
也可以看看?copy
, ?setDT
和?setDF
。 这些函数的帮助页面的第一段是:
按照data.table
说法,所有set*
函数通过引用来改变它们的输入。 也就是说,除了临时工作内存之外,根本就没有任何副本,它只有一列那么大。唯一通过引用修改输入的其他data.table
运算符是:=
。 查看下面的其他set*
函数data.table提供的See Also
部分。
和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)
我认为这很清楚。 但我会尽量提供更清晰的。 另外,我会尝试在文档中添加如何最好地使用这些函数。
链接地址: http://www.djcxy.com/p/23193.html上一篇: Wrapper functions for data.table
下一篇: How to remove elements from a queue in Java with a loop