Data.Table:通过引用有条件地更新.SD中的值

时间:2017-02-16 14:31:08

标签: r performance data.table

我是data.table包的新手。 我正在研究一个大数据。表(60列,900万行) 并希望在所有列中将所有负值替换为0。

我目前的解决方案是:

dt2 <- dt[, lapply(.SD,function(x) {ifelse(x < 0,0,x)})]

这需要约。每列8s。 我想使用:=运算符并跳过该函数以使其更快。 但我不知道如何引用.SD

选择的当前列

e.g。

dt[, lapply(.SD, .SD[<0] := 0]

我该怎么做?

1 个答案:

答案 0 :(得分:3)

我们可以使用set方式进行分配。循环遍历列序列,然后获取值小于0(i)的行索引,在'j'中指定列索引,并将与这些索引对应的值设置为0。

for(j in seq_along(dt)){
   set(dt, i = which(dt[[j]]<0), j=j, value = 0)
} 

或另一种选择是

dt[, lapply(.SD, function(x) pmax(0, x))]