Коли слід використовувати оператор: = у data.table?


88

data.tableоб’єкти тепер мають оператор: =. Чим цей оператор відрізняється від усіх інших операторів присвоєння? Крім того, яке його використання, наскільки це швидше, і коли цього слід уникати?

Відповіді:


94

Ось приклад, на якому показано 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

26
Дякуємо за розробку цього пакету. У мене відчуття, що я переглядаю багато свого коду, щоб використовувати цей пакет.
Ітератор

1
У чаті мене попросили самостійно запитати / відповісти (що, мабуть, заохочується ) - це питання тут
Matt Dowle

4
@MatthewDowle Хочете включити пояснення, коли не використовувати: = і замість цього використовувати set ()?
Арі Б. Фрідман,

2
@MatthewDowle Я б знову поставив +1, якби міг.
Арі Б. Фрідман

3
@jabberwocky Немає проблем. set(DT, i, "V1", i)встановлює "V1"стовпець, тоді як set(DT, i, colVar, i)встановлює ім'я стовпця, що міститься у colVarзмінній (наприклад, якщо це colVar = "V1"було зроблено раніше). Лапки вказують на те, що ім'я стовпця слід сприймати буквально, а не шукати змінну.
Метт Доул,
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.