data.table
objek sekarang memiliki operator: =. Apa yang membuat operator ini berbeda dari semua operator penugasan lainnya? Juga, apa kegunaannya, seberapa cepat, dan kapan harus dihindari?
data.table
objek sekarang memiliki operator: =. Apa yang membuat operator ini berbeda dari semua operator penugasan lainnya? Juga, apa kegunaannya, seberapa cepat, dan kapan harus dihindari?
Jawaban:
Berikut adalah contoh yang menunjukkan 10 menit dikurangi menjadi 1 detik (dari BERITA di beranda ). Ini seperti menugaskan subtugas data.frame
tetapi 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 j
seperti 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 for
lingkaran. 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
, nomatch
dll Jadi untuk di dalam for
loop, ada overhead rendah, versi langsung :=
disebut set
. Lihat ?set
untuk detail dan contoh lebih lanjut. Kerugian dari set
include yang i
harus berupa nomor baris (tidak ada pencarian biner) dan Anda tidak dapat menggabungkannya dengan by
. Dengan melakukan pembatasan tersebut set
dapat 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
set(DT, i, "V1", i)
mengatur "V1"
kolom sementara set(DT, i, colVar, i)
mengatur nama kolom yang terkandung dalam colVar
variabel (misalnya jika colVar = "V1"
dilakukan sebelumnya). Tanda kutip menunjukkan untuk menggunakan nama kolom secara harfiah daripada mencari variabel.