2012-11-21 14 views
11

Sadece merak katılmak gibidış dış yapmak için etkili bir yol var veri tablosuyla birleşimler ise data.table R

a <- data.table(a=c(1,2,3),b=c(3,4,5)) 
b <- data.table(a=c(1,2),k=c(1,2)) 
merge(a,b,by="a",all.x=T) 

bu çalışıyor, ancak iç daha büyük verilerle katılmak olduğunca verimli değildir Aşağıdaki gibi çok hızlı çalışır, ancak yukarıdaki gerçekten çok yavaş.

setkey(a,a) 
setkey(b,a) 
a[b,] 
+0

İlk durumda, "a" ve "b" anahtarsızdır, bu nedenle "birleştirme" ilk önce onları (yerel kopyaların (tür) birleştirme içinde olması gerektiğinden "a" ve "değiştirmek" istemez. arama kapsamı. İkinci durumda, “a” ve “b” harflerini değiştirerek mutlu olursunuz (bunu yapmak için zaman eklediniz mi?) Ve sonra “a [b]” hızlıdır. Ama ben bile şaşırdım, büyük bir fark var. 'merge' _should_ 'x [y] 'ile oldukça karşılaştırılabilir. Zamanlamaları hakkında konuşurken lütfen sürüm bilgisini belirtin: v1.8.6'da mısınız? Ayrıca "çok hızlı" ve "çok yavaş" kelimeleriniz "benzer" fikrim olabilir! Gerçek zamanlar nelerdir? –

+0

Kötü/uygunsuz bir şekilde kıyaslama yapmak çok kolay, bu yüzden kesinlikle bir şey söylemeden önce zamanlama yönteminizi görmemiz gerekiyor. –

+0

Bunun için zaman ayırabildim ve bellekte ilk patlayan R oturumu çöktü (yaklaşık 19m satırları birleştirerek). Daha küçük bir setle karşılaştırmalıyım ve sonuçları yayınlayacağım. (sürüm 1.8.2, kullanıyorum) – jamborta

cevap

10

b[a,] aradığınız "dış birleşim" dir.

Daha ayrıntılı bilgiler için ?merge.data.table'a bakın.

+0

Teşekkürler! Yani bir [b,] veya b [a,] esas olarak sol birleşim (SQL terimlerinde)? Bunu hep içten bir katılım olarak düşündüm. – jamborta

+0

@jamborta SSS'ye bakınız. 2.16 ('nomatch = 0 | NA') –

+1

teşekkürler Matthew, bunu açıklıyor. Bu şekilde tam dış birleşim yapamayacağınızı (sadece sol dış ve iç) kabul ediyorum. – jamborta