2017-02-16 6 views
0

Я новичок в пакете data.table. Я работаю над большой таблицей данных (60 столбцов, 9 миллионов строк) и хотел бы заменить все отрицательные значения на 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

 Смежные вопросы

  • Нет связанных вопросов^_^