TłoWewnętrzna przyłączyć za pomocą wyrażenia nierówność
(nie jest wymagany na pytanie, ale może być przydatny do odczytu)
Rolling join on data.table with duplicate keys
Odd behaviour when joining with multiple conditions
danych
library(data.table) ## using version 1.9.6
## arrival timetable
dt_arrive <- structure(list(txn_id = c(1L, 1L, 1L, 1L, 1L), place = c("place_a",
"place_a", "place_a", "place_a", "place_a"), arrival_minutes = c(515,
534, 547, 561, 581), journey_id = 1:5), .Names = c("txn_id",
"place", "arrival_minutes", "journey_id"), class = c("data.table",
"data.frame"), row.names = c(NA, -5L), sorted = c("txn_id",
"place"))
## departure timetable
dt_depart <- structure(list(txn_id = c(1L, 1L, 1L, 1L), place = c("place_a",
"place_a", "place_a", "place_a"), arrival_minutes = c(489, 507,
519, 543), journey_id = 10:13), .Names = c("txn_id", "place",
"arrival_minutes", "journey_id"), sorted = c("txn_id", "place"
), class = c("data.table", "data.frame"), row.names = c(NA, -4L
))
> dt_arrive
txn_id place arrival_minutes journey_id
1: 1 place_a 515 1
2: 1 place_a 534 2
3: 1 place_a 547 3
4: 1 place_a 561 4
5: 1 place_a 581 5
> dt_depart
txn_id place arrival_minutes journey_id
1: 1 place_a 489 10
2: 1 place_a 507 11
3: 1 place_a 519 12
4: 1 place_a 543 13
Pytanie
ja przyłączyć się do przybyłych do pójścia do tylko tych dt_depart$journey_id
które występują podt_arrive$journey_id
pod względem arrival_minutes
(tj sprzężenie wewnętrzne na txn_id
& place
)
Na przykład, to wyjście ja jak to:
txn_id place journey_in_id journey_out_id journey_place_arrive journey_place_depart
1 place_a 1 12 515 519
1 place_a 1 13 515 543
1 place_a 2 13 534 543
Próby
Stosując metodę z dwóch połączonych pytań, skonstruowaliśmy
setkey(dt_arrive, txn_id, place)
setkey(dt_depart, txn_id, place)
dt_join <- dt_arrive[dt_depart,
{
idx = (i.arrival_minutes > arrival_minutes)
.(journey_in_id = journey_id[idx],
journey_out_id = i.journey_id,
journey_place_arrive = arrival_minutes[idx],
journey_place_depart = i.arrival_minutes
)
},
by=.EACHI]
Ale to daje wszystko od dt_depart
, a więc obejmuje NA
S w rezultacie - co sugeruje „prawo dołączyć”:
txn_id place journey_in_id journey_out_id journey_place_arrive journey_place_depart
1: 1 place_a NA 10 NA 489
2: 1 place_a NA 11 NA 507
3: 1 place_a 1 12 515 519
4: 1 place_a 1 13 515 543
5: 1 place_a 2 13 534 543
Próbowałem została, używając nomatch=0
aby zmusić go do „sprzężenia wewnętrznego”, ale to nie działało.
Mogę użyć complete.cases
, aby usunąć wiersze NA
, ale zastanawiałem się, czy istnieje sposób na wykonanie tego w samym zapytaniu?
Dlaczego twoje wyjście "Na przykład" wykluczenia 534 do 543 linii? – Frank
@Frank litero - należy dołączyć. – tospig
@Frank Czy usunąłeś swoją odpowiedź? Pomyślałem, że w każdym razie zawiera trzy wymagane linie? – tospig