Pakiet data.table
zapewnia wiele takich samych metod obsługi tabel, jak SQL. Jeśli tabela ma klucz, ten klucz składa się z co najmniej jednej kolumny. Ale tabela nie może mieć więcej niż jednego klucza, ponieważ nie może być posortowana na dwa różne sposoby w tym samym czasie.Tłumaczenie połączeń SQL na klucze obce na składnię R data.table
W tym przykładzie X
i Y
s są data.table
s z jedną kolumną klucza "id"; Y
ma również niepustą kolumnę "x_id".
X <- data.table(id = 1:5, a=4:8,key="id")
Y <- data.table(id = c(1,1, 3,5,7), x_id=c(1,4:1), key="id")
Następująca składnia byłoby połączyć tabele na ich klucze:
X[Y]
Jak Mogę przetłumaczyć następujące SQL składni do kodu data.table?
select * from X join Y on X.id = Y.x_id;
Najbliżej że mam zdobyć to:
Y[X,list(id, x_id),by = x_id,nomatch=0]
to jednak nie to samo sprzężenie wewnętrzne jak SQL.
Oto bardziej wyraźnym przykładem, w którym klucz obcy jest y_id i chcemy dołączyć do wyszukania wartości Y2 gdzie X2$y_id = Y2$id
.
X2 <- data.table(id = 1:5, y_id = c(1,1,2,2,2), key="id")
Y2 <- data.table(id = 1:5, b = letters[1:5], key="id")
chciałbym produkować tabeli:
id y_id b
1 1 "a"
2 1 "a"
3 2 "b"
4 2 "b"
5 2 "b"
podobny do tego, co odbywa się według następującego kludge:
> merge(data.frame(X2), data.frame(Y2), by.x = "y_id", by.y = "id")
y_id id b
1 1 1 a
2 1 2 a
3 2 3 b
4 2 4 b
5 2 5 b
Jednak, kiedy to zrobić:
X2[Y2, 1:2,by = y_id]
Nie otrzymuję pożądanego rezultatu:
y_id V1
[1,] 1 1
[2,] 1 2
[3,] 2 1
[4,] 2 2
można czasowo zmienić 'klucze X2' i ustawić je na' "y_id" '; następnie wykonaj normalne połączenie 'Y2 [X2]' (lub 'X2 [Y2]' w zależności od kierunku), a następnie przywróć poprzedni klucz 'X2'. – digEmAll
@digEmAll, który jest przydatny, myślałem, że to jest to, co robi argument 'by' ... ale czy można to zastosować do wielokrotnego łączenia (> 2) tabeli, gdzie tabela docelowa (po lewej) ma> 1 klucz obcy? –
Zgadzam się z @digEmAll: 'setkey (X2, y_id)', po którym następuje 'X2 [Y2, nomatch = 0]' jest wszystkim czego potrzebujesz dla twojego przykładu. A to powinno działać również z kilkoma klawiszami. Jednak nie jestem obeznany ze składnią klucza obcego w SQL, więc jeśli zmagasz się z większą liczbą kluczy, czy mógłbyś rozszerzyć swój przykład? –