Tłumaczenie złączeń SQL na klucze obce na dane R.składnia tabeli

The data.table pakiet dostarcza wiele takich samych metod obsługi tabel jak SQL. Jeśli tabela zawiera klucz, klucz ten składa się z jednej lub więcej kolumn. Ale tabela nie może mieć więcej niż jednego klucza, ponieważ nie może być sortowana na dwa różne sposoby w tym samym czasie.

W tym przykładzie, X i Ydata.tableS z kolumną z pojedynczym kluczem "id"; Y ma również kolumnę bez klucza "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 dołączy do tabel na ich klucze:

  X[Y]

Jak mogę przetłumaczyć następującą składnię SQL na dane.kod do stołu?

  select * from X join Y on X.id = Y.x_id; 

Najbliższy, jaki zdobyłem to:

Y[X,list(id, x_id),by = x_id,nomatch=0]

To jednak nie robi tego samego wewnętrznego join co polecenie SQL.


Oto bardziej jasny przykład, w którym kluczem obcym jest y_id i chcemy, aby join wyszukał 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 stworzyć tabelę:

   id  y_id  b
    1     1 "a"
    2     1 "a"
    3     2 "b"
    4     2 "b"
    5     2 "b"

Podobne do tego, co robi się przez następujące 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 robię:

    X2[Y2, 1:2,by = y_id]

Nie dostaję pożądanego rezultatu:

    y_id V1
[1,]    1  1
[2,]    1  2
[3,]    2  1
[4,]    2  2
Author: Matt Dowle, 2012-03-28

1 answers

Dobre pytanie. Zwróć uwagę na następujące (co prawda Zakopane) w ?data.table:

Gdy i jest data.table, x musi mieć klucz. {[3] } jest połączone z x za pomocą klucza i zwracane są wiersze w x, które pasują. Funkcja equi-join jest wykonywana pomiędzy każdą kolumną w i A każdą kolumną w kluczu x. Dopasowanie to wyszukiwanie binarne w skompilowanym C w czasie o (log n). Jeśli i ma mniej kolumn niż klucz x, to wiele wierszy x może pasować do każdego wiersza i. If i ma więcej kolumn od klucza x, kolumny {[3] } nie biorące udziału w połączeniu są uwzględniane w wyniku. Jeśli i ma również klucz, to kolumny klucza i są używane do dopasowania do kolumn klucza x i przeprowadza się binarne scalanie obu tabel.

Klucz jest taki, że i nie musi być kluczowany. Tylko x musi być kluczowany.

X2 <- data.table(id = 11:15, y_id = c(14,14,11,12,12), key="id")
     id y_id
[1,] 11   14
[2,] 12   14
[3,] 13   11
[4,] 14   12
[5,] 15   12
Y2 <- data.table(id = 11:15, b = letters[1:5], key="id")
     id b
[1,] 11 a
[2,] 12 b
[3,] 13 c
[4,] 14 d
[5,] 15 e
Y2[J(X2$y_id)]  # binary search for each item of (unsorted and unkeyed) i
     id b
[1,] 14 d
[2,] 14 d
[3,] 11 a
[4,] 12 b
[5,] 12 b

Lub

Y2[SJ(X2$y_id)]  # binary merge of keyed i, see ?SJ
     id b
[1,] 11 a
[2,] 12 b
[3,] 12 b
[4,] 14 d
[5,] 14 d

identical(Y2[J(X2$y_id)], Y2[X2$y_id])
[1] FALSE
 17
Author: Matt Dowle,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-03-29 21:10:35