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?
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?
Jawaban:
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
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.