Когда мне следует использовать оператор:= в data.table?

data.table объекты теперь имеют оператор:=. Чем этот оператор отличается от всех других операторов присваивания? Кроме того, для чего он нужен, насколько он быстрее и когда его следует избегать?

1 ответ

Решение

Вот пример, показывающий 10 минут, уменьшенных до 1 секунды (из НОВОСТЕЙ на домашней странице). Это как подчинение data.frame но не копирует всю таблицу каждый раз.

m = matrix(1,nrow=100000,ncol=100)
DF = as.data.frame(m)
DT = as.data.table(m)

system.time(for (i in 1:1000) DF[i,1] <- i)
     user  system elapsed 
  287.062 302.627 591.984 

system.time(for (i in 1:1000) DT[i,V1:=i])
     user  system elapsed 
    1.148   0.000   1.158     ( 511 times faster )

Ввод := в j как это позволяет больше идиом:

DT["a",done:=TRUE]   # binary search for group 'a' and set a flag
DT[,newcol:=42]      # add a new column by reference (no copy of existing data)
DT[,col:=NULL]       # remove a column by reference

а также:

DT[,newcol:=sum(v),by=group]  # like a fast transform() by group

Я не могу придумать причин, чтобы избежать :=! Кроме, внутри for петля. поскольку := появляется внутри DT[...], это идет с небольшой накладной [.data.table Способ; например, S3 диспетчеризация и проверка наличия и типа аргументов, таких как i, by, nomatch и т.д. Так что внутри for петли, есть низкие накладные расходы, прямая версия := называется set, Увидеть ?set для более подробной информации и примеров. Недостатки set включить это i должны быть номера строк (без двоичного поиска), и вы не можете объединить его с by, Делая эти ограничения set может значительно снизить накладные расходы.

system.time(for (i in 1:1000) set(DT,i,"V1",i))
     user  system elapsed 
    0.016   0.000   0.018
Другие вопросы по тегам