R 将函数应用于嵌套字段时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[

我编写了一个函数,将另一个函数应用于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[,.(.(.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
参数。也许其他人会对你的代码的这一部分有一个解决方案,我心里没有。这都是我的错,我的问题不清楚。非常感谢。