R 将函数应用于嵌套字段时data.table性能不佳
我编写了一个函数,将另一个函数应用于data.table中的每个嵌套字段:R 将函数应用于嵌套字段时data.table性能不佳,r,data.table,R,Data.table,我编写了一个函数,将另一个函数应用于data.table中的每个嵌套字段: n <- 3000 nameslist <- paste0("NAME",1:n) dt <- data.table(name_var = nameslist , value_var = rnorm(1e7) , car_color = c("B","B","B","G","G","G","G")) dt <- dt[
n <- 3000
nameslist <- paste0("NAME",1:n)
dt <- data.table(name_var = nameslist
, value_var = rnorm(1e7)
, car_color = c("B","B","B","G","G","G","G"))
dt <- dt[,.(.(.SD)), by = name_var] # nesting dt and finishing toy data creation
transform_value <- function(x, fun, campo, ...) {
x [, match.fun (fun)(get(campo), ...)] }
system.time({
dt[, min_value:=lapply(V1, transform_value, "min", "value_var")
]})
n既然你对性能感兴趣,你就应该设置一个主键。一旦支付了设置密钥的固定成本(这意味着对连续内存插槽中的行进行重新排序),您将获得显著的收益
再举一次你的例子
dt该计时用于没有by
参数的赋值行。你能澄清一下dt[,(.SD)),by=name\u var
是慢还是transform\u value
慢吗?就像科尔说的,你只是用lappy
按行循环,我真的看不出by
arg责备在哪里。@Cole,慢是在transform\u value循环中,而不是在dt[,(.SD)),by=name\var]循环。@Davidernburg,我编辑了这个问题,现在更清楚了,谢谢。同样,据我所知,您在嵌套的data.table中逐行运行,而每一行都是另一个相当大的data.table,而您正在对其应用函数。data.table/data.frame未设计为按行操作。相反,您应该避免嵌套数据集,而是将函数应用于整个组。而且,get
的内存非常紧张。您只需在原始dt
上执行dt[,min(value\u var),by=name\u var]
(嵌套之前)。如果您有一些更复杂的函数,只需预定义它,然后像上面那样使用。谢谢@linog。实际上,慢的循环是我测量执行时间的循环,其中有transform_value函数。在这种情况下,这是一个不同的问题,很抱歉误解了。这不是应该受到责备的by
参数。也许其他人会对你的代码的这一部分有一个解决方案,我心里没有。这都是我的错,我的问题不清楚。非常感谢。