data.table
nesnelerin 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?
data.table
nesnelerin 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:
İş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.frame
ancak 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 j
o 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 for
döngü içinde dışında . Yana :=
içinde görünen DT[...]
bu küçük giderler ile birlikte gelir [.data.table
yöntemiyle; örneğin S3 sevk ve gibi argümanlar varlığı ve türü için kontrol i
, by
, nomatch
iç vb So for
döngüler, düşük havai, doğrudan sürümü var :=
denilen set
. Daha ?set
fazla ayrıntı ve örnek için bakın . Dezavantajları set
olduğunu şunlardır i
olmalı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
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.