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