Kapan saya harus menggunakan operator: = di data.table?

88

data.tableobjek sekarang memiliki operator: =. Apa yang membuat operator ini berbeda dari semua operator penugasan lainnya? Juga, apa kegunaannya, seberapa cepat, dan kapan harus dihindari?

Ari B. Friedman
sumber

Jawaban:

95

Berikut adalah contoh yang menunjukkan 10 menit dikurangi menjadi 1 detik (dari BERITA di beranda ). Ini seperti menugaskan subtugas data.frametetapi tidak menyalin seluruh tabel setiap kali.

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 )

Menempatkan :=in jseperti itu memungkinkan lebih banyak idiom:

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

dan:

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

Saya tidak bisa memikirkan alasan untuk menghindar :=! Selain, di dalam satu forlingkaran. Sejak :=muncul di dalam DT[...], ia datang dengan metode overhead kecil [.data.table; misalnya, S3 pengiriman dan memeriksa keberadaan dan jenis argumen seperti i, by, nomatchdll Jadi untuk di dalam forloop, ada overhead rendah, versi langsung :=disebut set. Lihat ?setuntuk detail dan contoh lebih lanjut. Kerugian dari setinclude yang iharus berupa nomor baris (tidak ada pencarian biner) dan Anda tidak dapat menggabungkannya dengan by. Dengan melakukan pembatasan tersebut setdapat mengurangi overhead secara dramatis.

system.time(for (i in 1:1000) set(DT,i,"V1",i))
     user  system elapsed 
    0.016   0.000   0.018
Matt Dowle
sumber
27
Terima kasih telah mengembangkan paket ini. Saya merasa saya akan merevisi banyak kode saya untuk menggunakan paket ini.
Iterator
1
Pada obrolan saya diminta untuk bertanya / menjawab sendiri (yang tampaknya dianjurkan ) - pertanyaan itu ada di sini
Matt Dowle
4
@MatthewDowle Ingin menyertakan penjelasan tentang kapan tidak menggunakan: = dan menggunakan set () sebagai gantinya?
Ari B. Friedman
2
@MatthewDle saya akan memberi +1 lagi jika saya bisa.
Ari B. Friedman
3
@jabberwocky Tidak masalah. set(DT, i, "V1", i)mengatur "V1"kolom sementara set(DT, i, colVar, i)mengatur nama kolom yang terkandung dalam colVarvariabel (misalnya jika colVar = "V1"dilakukan sebelumnya). Tanda kutip menunjukkan untuk menggunakan nama kolom secara harfiah daripada mencari variabel.
Matt Dowle