将向量化函数应用于唯一值并扩展

时间:2018-11-14 08:08:02

标签: r data.table

我想加快dt[,col2:=f(col1)]的计算 通过仅对f的不同值运行col1dt是数据表,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)}

1 个答案:

答案 0 :(得分:1)

您只需执行dt[, col2 := f(col1[1]), by = col1]。显然,分组操作和重复调用闭包f一样,会带来一些性能开销。因此,只有在f的向量化速度很慢(例如,内部存在循环)并且您拥有大量重复值的情况下,您才能使用此策略提高性能。我建议做一些基准测试。