我想加快dt[,col2:=f(col1)]
的计算
通过仅对f
的不同值运行col1
。 dt
是数据表,f
返回与输入长度相同的向量。
有没有比这更好的方法
dt[, id:=.GRP, by=.(col1)]
tmp <- dt[,.(col1=col1[1]), by=.(id)][,col2:=f(col1)]
dt[, col2:=tmp$col2[match(id, tmp$id)]][,id:=NULL]
#for example
#dt<-data.table(col1=sample(1:10, 100, replace=T))
#f<-function(x) {print(x); paste("a",x)}
答案 0 :(得分:1)
您只需执行dt[, col2 := f(col1[1]), by = col1]
。显然,分组操作和重复调用闭包f
一样,会带来一些性能开销。因此,只有在f
的向量化速度很慢(例如,内部存在循环)并且您拥有大量重复值的情况下,您才能使用此策略提高性能。我建议做一些基准测试。