2013-04-16 30 views
7

Jeśli dobrze rozumiem, domyślnie data.table scala dwie tabele, porównując kolumny, które są ustawione jako klucze i mają te same nazwy. Jak mam pisać, jeśli mam tabele o różnych nazwach kolumn? Na przykład:scalanie tabel o różnych nazwach kolumn

set.seed(123) 
DT1<-data.table(col1=sample(letters,5,replace=TRUE),col2=sample(LETTERS[1:5],5,replace=TRUE),col3=sample(1:2,5,replace=TRUE)) 
DT2<-data.table(col4=sample(1:3,10,replace=TRUE),col5=sample(LETTERS[1:5],10,replace=TRUE),col6=sample(1:100,10,replace=TRUE)) 
(DT1) 
(DT2) 

> (DT1) 
    col1 col2 col3 
1: h A 2 
2: u C 1 
3: k E 2 
4: w C 2 
5: y C 1 
> (DT2) 
    col4 col5 col6 
1: 3 D 48 
2: 1 C 76 
3: 1 C 22 
4: 1 B 32 
5: 3 A 24 
6: 3 E 15 
7: 3 E 42 
8: 2 D 42 
9: 3 D 37 
10: 2 A 16 

Co powinienem napisać w DT1[ dokonać scalenia określenie tylko wiersze z col2 == Col5 & Col3 == Col4? Oto oczekiwany wynik:

col1 col2 col3 col4 col5 col6 
    h A 2 2 A 16 
    u C 1 1 C 76 
    u C 1 1 C 22 
    y C 1 1 C 76 
    y C 1 1 C 22 

Z góry dzięki!

+0

Czy możesz pokazać nam wyniki, których się spodziewasz? – Arun

+0

pewnie, tylko sekundę –

+0

dodam, że jest to dobre pytanie, które należy mieć na uwadze, próbując dowiedzieć się, dlaczego 'data.table' scalił się na" złych "kolumnach, gdy nie rozróżnia się kluczy roztropnie. – MichaelChirico

Odpowiedz

21

Korzystanie podzbiór data.table oparte dołącza wraz z ostatnio realizowanego on= argumentu i nomatch=0L, jest to po prostu:

DT2[DT1, on=c(col5="col2", col4="col3"), nomatch=0L] 

Zobacz secondary indices winietę więcej.


Alternatywnie, jeśli już to data.tables nadwozia, a następnie można pominąć on= argument. Ale powyższe rozwiązanie byłoby idiomatyczne, ponieważ zachowuje kolejność oryginalnych tabel danych. Jest jasne, aby powiedzieć, jakie kolumny są wyszukiwane, patrząc na kod.

setkey(DT1, col2, col3) 
setkey(DT2, col5, col4) 
DT2[DT1, nomatch=0L] 

Zobacz historię dla starszych wersji.

+0

świetnie! Nie znałem tych szczegółów funkcjonowania "setkey". Dziękuję Ci bardzo! –

Powiązane problemy