2011-01-21 8 views
13

GÜNCELLEME: Eski soru ... o Feb içinde data.table v1.5.3 tarafından çözüldü 2011.R: data.table kullanırken x [y] 'yi kullanırken y sütunlarını nasıl alabilirim?

, ben data.table paketi kullanmak çalışıyorum ve gerçekten hızlandırıcılar gibi alıyorum ama Ben x[y, <expr>] nerede x ve y aynı anahtarla "veri tabloları" dir yapmak bu hata kelimler ve <expr> hem x ve y sütun adlarını içeren am:

require(data.table) 
x <- data.table(foo = 1:5, a = 5:1) 
y <- data.table(foo = 1:5, boo = 10:14) 
setkey(x, foo) 
setkey(y, foo) 
> x[y, foo*boo] 
Error in eval(expr, envir, enclos) : object 'boo' not found 

sayfamız TE ... Yukarıdaki örnekte arıyorum işlevselliği netleştirmek için: Ancak data.table SSS aşağıda ekstresi göre

with(merge(x,y), foo*boo) 

, bu çalışmış olmalıdır: Aşağıdaki eşdeğer yapmak gerekir :

Son olarak, x [y] y sütunları dönmez olsa aslında j ifadede y sütunları kullanabilirsiniz olarak görünür halde. Bu, devralınan kapsamın birleşimiyle anlamına gelir. Neden , sadece sütunlarının birleşimini x ve y'den döndürüp, ardından ifadelerini çalıştırıyor? Kodun yeterliliğine ve program için daha hızlı olan 'a kadar kaynar. x [y, foo boo] yazdığınızda, data.table otomatik olarak , j ifadesini, kullandığı sütunlarını görmek için inceler. Yalnızca veya grubu, yalnızca bu sütunları alt gruplara ayıracaktır. Bellek yalnızca j kullanım alanları için oluşturulmuştur. Foo'nun x olduğunu ve 'un y konumunda olduğunu (y içinde diğer 20 sütunla birlikte) diyelim. X [y, foo boo] programına göre daha hızlıdır ve birleştirme adımından daha hızlı çalışıp daha sonra adımlı başka bir alt kümedir.

Benzer bir soruna hitap eden this question'un farkındayım, ancak tatmin edici bir şekilde çözülmemiş gibi görünüyor. Neyi kaçırdığımı veya yanlış anlaşıldığımı bilen var mı? Teşekkürler.

GÜNCELLEME: Veri tablosu yardım listesi ve paket yazarı (Matta Dowle) replied'dan gerçekten yukarıda bahsedilen SSS'nin yanlış olduğunu sordum, dolayısıyla kullandığım sözdizimi şu an çalışmaz; Ben x[y,...] yaptığımda j (yani ikinci) bağımsız değişkeninde y sütunları.

+0

Ama bir süre önce sordun ve Şubat 2011'de CRAN'a sunulan v1.5.3 tarafından ele alındı. Lütfen bunun NEWS, yeni? Data.table ve düzeltilmiş SSS olduğunu görün. –

+0

@Matthew, evet, en son sürüm tarafından ele alındığını biliyorum, ve burada işaret ettiğine sevindim, bu yüzden başkalarına açık. –

cevap

4

Sorunu iyi anlayabildiğimden emin değilim ve ayrıca verilerinin belgelerini okumaya başladım.İşte

> x[y,a*y] 
    foo boo 
[1,] 5 50 
[2,] 8 44 
[3,] 9 36 
[4,] 8 26 
[5,] 5 14 

elde edersiniz: Eğer y sütunları olsun ister ve ayrıca bir ait sütunlara göre olanlara bir şey yapacağını eğer masa kütüphane, ama ben, gibi bir şey deneyebilirsiniz düşünüyorum y sütunlarını sütununun ile çarpınız. Eğer x almak istiyorsanız s 'nin fooy ile çarpılması' boo, deneyin:

> y[,x*boo] 
    foo a 
[1,] 10 50 
[2,] 22 44 
[3,] 36 36 
[4,] 52 26 
[5,] 70 14 

düzenleme sonra: soru daha net hale size @Prasad Chalasani teşekkür benim için.

Basit birleştirme tercih edilirse, aşağıdakiler çalışmalıdır. Ben eylemleri derin görmeye daha karmaşık veri oluşur:

x <- data.table(foo = 1:5, a=20:24, zoo = 5:1) 
y <- data.table(foo = 1:5, b=30:34, boo = 10:14) 
setkey(x, foo) 
setkey(y, foo) 

Yani sadece ekstra bir sütun her data.table eklendi. Bize merge görelim ve data.tables ile yapıyor:

ikincisi çok daha hızlı görünüyor Kullanıcılar hangi
> system.time(merge(x,y)) 
    user system elapsed 
    0.027 0.000 0.023 
> system.time(x[,list(y,x)]) 
    user system elapsed 
    0.003 0.000 0.006 

. Sonuçlar olsa özdeş değildir, ancak (ikinci vadede ekstra sütun ile) aynı şekilde kullanılabilir:

> merge(x,y) 
    foo a zoo b boo 
[1,] 1 20 5 30 10 
[2,] 2 21 4 31 11 
[3,] 3 22 3 32 12 
[4,] 4 23 2 33 13 
[5,] 5 24 1 34 14 
> x[,list(x,y)] 
    foo a zoo foo.1 b boo 
[1,] 1 20 5  1 30 10 
[2,] 2 21 4  2 31 11 
[3,] 3 22 3  3 32 12 
[4,] 4 23 2  4 33 13 
[5,] 5 24 1  5 34 14 

Yani xy kullanıyor olabiliriz almak için: xy <- x[,list(x,y)]. xy$foo * xy$boo tarafından gönderilen tek sütun data.table hesaplamak için, şu işe yarayabilecek:

> xy[,foo*boo] 
[1] 10 22 36 52 70 

Eh, sonuç data.table değil ama bir vektör yerine.


Güncellemesi (29.03.2012): merge.data.table Yukarıdaki örneklerde kullanıldığı gerçeği dikkatimi işaret için @ David için teşekkürler.

+0

Sorumluluktaki örnekle ilgili olarak, x'in ve "y" nin bir birleşimini yapmak istiyorum, 'xy' olarak adlandırın ve sonra xy $ foo'ya eşit olan tek sütunlu bir veri çerçevesi oluşturun. xy $ boo'. –

+0

@Prasad Chalasani: Cevabımı düzenledim, umarım yeni ve değerli bir şey bulabilirsin. – daroczig

+0

Ayrıntılar için teşekkürler, ama sorum, sorduğum soruda neden bahsettiğim belirli sözdiziminin, SSS'de yazdığı şeyin tersine, neden çalışmadığıydı. Bunu iki aşamada yapabileceğimi biliyorum (birleştirme, sonra sütunlar üzerinde çalış), ama x adımını () sözdizimini * bir adımda * çalışmasını istiyorum * Bir adımda x' ve 'y' sütunları. Bu sözdizimsel olarak daha az yorucudur ve muhtemelen daha hızlıdır (eğer içsel olarak uygulanmışsa). 10 milyon satırlık veri çerçeveleriyle uğraşıyorum, bu yüzden yukarıdaki küçük oyuncak örneğinin zamanlamaları ile ilgilenmiyorum. –

İlgili konular