Açık / basit bir cevap yok çünkü bu iki paketin de felsefeleri belirli açılardan farklılık gösteriyor. Yani bazı tavizler kaçınılmazdır. İşte ele almanız / dikkate almanız gerekebilecek endişelerden bazıları.
i
(== filter()
ve slice()
dplyr'de) içeren işlemler
DT
10 sütun ile varsayalım . Şu data.table ifadelerini göz önünde bulundurun:
DT[a > 1, .N]
DT[a > 1, mean(b), by=.(c, d)]
(1) DT
sütundaki satırların sayısını verir a > 1
. (2) , (1) ile aynı ifade için mean(b)
gruplanmış olarak döndürür .c,d
i
Yaygın olarak kullanılan dplyr
ifadeler şöyle olacaktır:
DT %>% filter(a > 1) %>% summarise(n())
DT %>% filter(a > 1) %>% group_by(c, d) %>% summarise(mean(b))
Açıkça, data.table kodları daha kısadır. Ayrıca bellek açısından daha verimli 1 . Neden? Çünkü hem (3) hem de (4) 'te, önce 10 sütunun tümü için satırlarıfilter()
döndürür , (3)' te sadece satır sayısına ihtiyacımız olduğunda ve (4) 'te sadece ardışık işlemler için sütunlara ihtiyacımız var . Bunu aşmak için apriori sütunlarına ihtiyacımız var :b, c, d
select()
DT %>% select(a) %>% filter(a > 1) %>% summarise(n())
DT %>% select(a,b,c,d) %>% filter(a > 1) %>% group_by(c,d) %>% summarise(mean(b))
İki paket arasındaki önemli bir felsefi farkı vurgulamak önemlidir:
İçinde data.table
, bu ilgili işlemleri bir arada tutmayı seviyoruz ve bu j-expression
(aynı işlev çağrısından) bakmaya ve (1) 'de herhangi bir sütuna gerek olmadığını anlamaya izin veriyor . İçindeki ifade i
hesaplanır ve .N
satır sayısını veren mantıksal vektörün sadece toplamıdır; tüm alt küme asla gerçekleştirilmez. (2) 'de, sadece sütun b,c,d
alt kümede gerçekleşir, diğer sütunlar yok sayılır.
Ama dplyr
felsefe, bir işleve tam olarak bir şeyi iyi yapmaktır . filter()
Filtrelediğimiz tüm bu sütunlara sonraki işlemin gerekip gerekmediğini söylemenin (en azından şu anda) bir yolu yok . Bu tür görevleri verimli bir şekilde gerçekleştirmek istiyorsanız ileriyi düşünmeniz gerekir. Ben şahsen bunu bu durumda mantıksız buluyorum.
(5) ve (6) 'da, a
ihtiyaç duymadığımız sütunu hala alt küme olarak belirlediğimizi unutmayın. Ama bundan nasıl kaçınacağımdan emin değilim. filter()
İşlevin döndürülecek sütunları seçmek için bir argümanı varsa , bu sorunu önleyebilirdik, ancak bu durumda işlev yalnızca bir görevi yapmayacaktır (bu aynı zamanda bir dplyr tasarım seçimidir).
Referansla alt atama
dplyr asla referans olarak güncellenmez. Bu, iki paket arasındaki başka bir büyük (felsefi) farktır.
Örneğin, data.table'da şunları yapabilirsiniz:
DT[a %in% some_vals, a := NA]
Sütunu , yalnızca koşulu sağlayan satırlarda a
referans olarak günceller . Şu anda dplyr, yeni bir sütun eklemek için tüm data.table'ı dahili olarak kopyalar. @BrodieG cevabında zaten bundan bahsetmişti.
Ancak derin kopya, FR # 617 uygulandığında sığ bir kopya ile değiştirilebilir . Ayrıca ilgili: dplyr: FR # 614 . Yine de, değiştirdiğiniz sütunun her zaman kopyalanacağını unutmayın (bu nedenle biraz daha yavaş / daha az bellek verimli). Sütunları referansa göre güncellemenin bir yolu olmayacaktır.
Diğer işlevler
Data.table'da, birleştirme sırasında birleştirme yapabilirsiniz ve bunu anlamak daha basittir ve ara birleştirme sonucu hiçbir zaman gerçekleşmediğinden bellek verimlidir. Örnek için bu gönderiye göz atın . Bunu (şu anda?) Dplyr'ın data.table / data.frame sözdizimini kullanarak yapamazsınız.
data.table'ın yuvarlanan birleştirme özelliği, dplyr'ın sözdiziminde de desteklenmez.
Son zamanlarda data.table'da , şu anda ayrı bir işlev olan ve bu nedenle boru operatörleriyle (magrittr / pipeR? - kendim hiç denemedim) aralık aralıkları üzerinden birleştirmek için örtüşme birleştirmeleri uyguladık ( burada bir örnekfoverlaps()
).
Ama nihayetinde amacımız, [.data.table
gruplama, birleştirme sırasında toplama vb. Gibi diğer özellikleri toplayabilmemiz için onu entegre etmektir . Bu sınırlamalar yukarıda belirtilen aynı sınırlamalara sahiptir.
1.9.4'ten beri data.table, normal R sözdiziminde hızlı ikili aramaya dayalı alt kümeler için ikincil anahtarları kullanarak otomatik indeksleme uygular. Örn: DT[x == 1]
ve DT[x %in% some_vals]
ilk çalıştırmada otomatik olarak bir indeks oluşturur, bu daha sonra aynı sütundan birbirini takip eden alt kümelerde ikili aramayı kullanarak hızlı alt kümeye kadar kullanılır. Bu özellik gelişmeye devam edecek. Bu özelliğe kısa bir genel bakış için bu özü kontrol edin .
Yolu itibaren filter()
data.tables için uygulanan, bu özellikten yararlanmak almaz.
Bir dplyr özelliği, şu anda data.table'ın sağlamadığı aynı sözdizimini kullanarak veritabanlarına arayüz sağlamasıdır .
Bu nedenle, bunları (ve muhtemelen diğer noktaları) tartmanız ve bu değiş tokuşların sizin için kabul edilebilir olup olmadığına göre karar vermeniz gerekecektir.
HTH
(1) Çoğu durumda darboğaz, verileri ana bellekten önbelleğe taşımak (ve önbellekteki verileri mümkün olduğunca kullanmak - önbellek kayıplarını azaltmak olduğundan, bellek verimli olmanın hızı doğrudan etkilediğini unutmayın (özellikle veriler büyüdükçe) - ana belleğe erişimi azaltmak için). Burada ayrıntılara girmiyorum.
dplyr
veri tabloları için yöntemler var , ancak veri tablosunun kendi karşılaştırılabilir yöntemleri de var