2013-02-21 8 views
8

Veri sütunumda index1 & index2 ortak sütunlarına göre bir arama tablosuyla birleştirerek yeni bir sütun key oluşturmak istiyorum. Daha sonra bu yeni key kolonu (a, b, c) değerlerinden, bir data.table içinde value sütun indisleri 3 yeni sütun (a, b, c) oluşturmak üzere istiyorum. BöyleArama tablosundaki data.table sütunları eklemek için daha iyi bir yol aranıyor

Benim data.table görünüyor:

index1 index2 key 
1 1  1 a 
2 1  2 b 
3 2  1 a 
4 2  2 c 
5 3  1 c 
6 3  2 b 

Sonuçta şu şekildedir:

index1  index2 value key  a  b  c 
1  2   0  0.00 NA  NA  NA  NA 
2  1   2 -5.00 b  NA -5.00  NA 
3  3   2 -5.00 b  NA -5.00  NA 
4  3   2 17.50 b  NA 17.50  NA 
5  2   2 15.00 c  NA  NA 15.00 
6  1   2 -7.50 b  NA -7.50  NA 
7  3   2  3.75 b  NA 3.75  NA 
8  1   2 -8.75 b  NA -8.75  NA 
9  2   1 15.00 a 15.00  NA  NA 
10  2   1 12.50 a 12.50  NA  NA 

bunu çözme çalıştı

index1  index2 value 
1  2   0  0.00 
2  1   2 -5.00 
3  3   2 -5.00 
4  3   2 17.50 
5  2   2 15.00 
6  1   2 -7.50 
7  3   2  3.75 
8  1   2 -8.75 
9  2   1 15.00 
10  2   1 12.50 

arama tablosu şudur önce data.table ve arama tablosunu merge() ile birleştirerek, J() thre Yukarıdaki sonuca ulaşmak için ayrı zamanlar. Ben data.table için oldukça yeni, ama birkaç kez prosedürü tekrarlamak yerine bunu çözmek için daha zarif bir yol öğrenmek isterim. Eğer & index2 index1 üzerinde katılmak isteyen beri var gibi merge kullanabilir ya da tablolardan her anahtarları olarak bu atarsanız, o zaman sadece katılmak için [] kullanabilirsiniz

DT <- merge(DT, lookup, by=c('index1', 'index2'), all.x=TRUE) 
DT <- data.table(DT) #Don't know why but DT became a data.frame after merge() 
DT[J("a"), a:=value] 
DT[J("b"), b:=value] 
DT[J("c"), c:=value] 
+1

Son bölümü tam olarak almıyorum: 'data.table'daki değeri endeksleyen 3 yeni sütun (a, b, c) oluşturmak istiyorum. Burada ne demek istiyorsun? Son çıktınızı gösterebilir mi? Ayrıca NA 'tuşlarını nasıl ele almak istersiniz? her iki şekilde bir araya getirme, 'NA' yaratır ... – Arun

+1

Özür dilerim. Kod bloklarını nasıl etiketleyeceğimizi anlamaya çalışıyordum. Şimdi tamamen düzenlenmiş. – SeanM

+1

, 'birleştirme 'kullanmayın. Bunun yerine '[DT]' yi kullanın ('X [Y]' sözdizimi). Tabii ki bunu yapmadan önce her iki tablo anahtarını 'index1, index2' olarak ayarlamanız gerekir. – Arun

cevap

7

: İşte benim kod.

DT 
#  index1 index2 value a  b c 
# 1:  1  2 -5.00 NA -5.00 NA 
# 2:  1  2 -7.50 NA -7.50 NA 
# 3:  1  2 -8.75 NA -8.75 NA 
# 4:  2  0 0.00 NA NA NA 
# 5:  2  1 15.00 15.0 NA NA 
# 6:  2  1 12.50 12.5 NA NA 
# 7:  2  2 15.00 NA NA 15 
# 8:  3  2 -5.00 NA -5.00 NA 
# 9:  3  2 17.50 NA 17.50 NA 
# 10:  3  2 3.75 NA 3.75 NA 
:

keyVals <- unique(lookup[, key]) 

for (k in keyVals) 
    DT[lookup[key==k], c(k) := value] 



Sonuçlar aşağıdaki gibi (DT[lookup] olduğu gibi)

setkey(lookup, index1, index2) 
setkey(DT, index1, index2) 

o zaman lookup tablodan benzersiz her key adımlayabilirsiniz 10

+1

+1 'arama [. (K)]' yerine vektör taraması yerine '==' belki de. –

+0

'c (k)', 'FALSE' ile önlemek için güzel LHS sözdizimidir. Bunu düşünmemiştim! –

+1

@MD Teşekkürler. 'LHS' –

İlgili konular