Data.table'da: = operatörünü ne zaman kullanmalıyım?


88

data.tablenesnelerin artık bir: = operatörü var. Bu operatörü diğer tüm atama operatörlerinden farklı kılan nedir? Ayrıca, kullanım alanları nelerdir, ne kadar hızlıdır ve ne zaman kaçınılmalıdır?

Yanıtlar:


95

İşte 10 dakikanın 1 saniyeye düşürüldüğünü gösteren bir örnek ( ana sayfadaki HABERLER'den ). Bu, a'ya alt atama yapmak gibidir, data.frameancak her seferinde tüm tabloyu kopyalamaz.

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 )

Koyarak :=içinde jo daha deyimleri verir gibi:

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

ve :

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

Kaçınmak için herhangi bir neden düşünemiyorum :=! Bir fordöngü içinde dışında . Yana :=içinde görünen DT[...]bu küçük giderler ile birlikte gelir [.data.tableyöntemiyle; örneğin S3 sevk ve gibi argümanlar varlığı ve türü için kontrol i, by, nomatchiç vb So fordöngüler, düşük havai, doğrudan sürümü var :=denilen set. Daha ?setfazla ayrıntı ve örnek için bakın . Dezavantajları setolduğunu şunlardır iolmalıdır satır numaralarını (hayır ikili arama) ile birleştirin edemez by. Bu kısıtlamaları yapmak set, genel giderleri önemli ölçüde azaltabilir.

system.time(for (i in 1:1000) set(DT,i,"V1",i))
     user  system elapsed 
    0.016   0.000   0.018

27
Bu paketi geliştirdiğiniz için teşekkürler. Bu paketi kullanmak için kodumun çoğunu gözden geçireceğim gibi bir his var .
Iterator

1
Sohbette benden kendime sormam / cevaplamam istendi (görünüşe göre teşvik ediliyor) - bu soru burada
Matt Dowle

4
@MatthewDowle Ne zaman kullanılmayacağına dair bir açıklama eklemek ve bunun yerine set () kullanmak ister misiniz?
Ari B. Friedman

2
@MatthewDowle, yapabilseydim tekrar + 1 ederdim
Ari B. Friedman

3
@jabberwocky Sorun değil. set(DT, i, "V1", i)ayarlar "V1"iken sütun set(DT, i, colVar, i)sütun adı içerdiği setleri colVar(eğer örneğin değişken colVar = "V1"önce yapıldığını). Tırnaklar, değişkeni aramak yerine sütun adını tam anlamıyla almayı belirtir.
Matt Dowle
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.