2017-02-16 86 views
0

我剛接觸data.table包。 我正在處理一個大的data.table(60列,900萬行) ,並希望在所有列中用0替換所有負值。Data.Table:通過引用有條件地更新.SD中的值

我目前的解決辦法是:

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

這需要約。每列8個。 我想使用:=運算符並跳過該函數使其更快。 但我不知道如何能夠參考.SD

所選的當前列。

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

我該怎麼做?

回答

1

我們可以使用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))] 
+0

謝謝akrun! 第二個選項已經快了4倍。 說實話,這個「定向」仍然超出我目前的知識水平。 你能解釋一下那裏發生了什麼,所以我可以將它集成到我的代碼中並測試它嗎? –

+0

@MarioKreutzfeldt我更新了一些描述的帖子。希望能幫助到你 – akrun

相關問題