data.table的包装函数

Ada*_*dam 7 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
}
Run Code Online (Sandbox Code Playgroud)

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

Aru*_*run 3

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

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

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

这些功能是最近推出的(主要是由于用户请求)。避免这种混乱的想法是导出shallow()函数并跟踪需要复制列的对象,并在内部(自动)完成这一切。现在一切还处于非常早期的阶段。当我们成功后,我会更新这篇文章。


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

换句话说data.table,所有set*函数都通过引用更改其输入。也就是说,除了临时工作内存(与一列一样大)之外,根本不进行任何复制。data.table通过引用修改输入的唯一其他运算符是:=。查看See Also下面的部分,了解 data.table 提供的其他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"][]
Run Code Online (Sandbox Code Playgroud)

不做任何作业(尽管我承认这里可以更好地解释)。

setDF

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

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