data.table
теперь у объектов есть оператор: =. Что отличает этот оператор от всех других операторов присваивания? Кроме того, каково его использование, насколько он быстрее и когда его следует избегать?
data.table
теперь у объектов есть оператор: =. Что отличает этот оператор от всех других операторов присваивания? Кроме того, каково его использование, насколько он быстрее и когда его следует избегать?
Ответы:
Вот пример сокращения 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
include в том, что это i
должны быть номера строк (без двоичного поиска), и их нельзя комбинировать с by
. Эти ограничения set
могут значительно снизить накладные расходы.
system.time(for (i in 1:1000) set(DT,i,"V1",i))
user system elapsed
0.016 0.000 0.018
set(DT, i, "V1", i)
устанавливает "V1"
столбец, в то время как set(DT, i, colVar, i)
задает имя столбца, содержащееся в colVar
переменной (например, если это colVar = "V1"
было сделано ранее). Кавычки указывают на то, что имя столбца следует воспринимать буквально, а не искать переменную.