Когда мне следует использовать оператор:= в 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