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
включають, що 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"
було зроблено раніше). Лапки вказують на те, що ім'я стовпця слід сприймати буквально, а не шукати змінну.