Я адаптирую пример , показанный здесь , где я хотел бы присоединить некоторые результаты теста к существующим данным сеанса, но я знаю, что тесты могли проводиться за три часа до или послесеанс был создан тем же пользователем.
Однако в результате я получаю дубликаты столбцов user_id
, несмотря на указание их в опции by
, а сами значения не добавляются в данныеframe:
library(tidyverse)
library(lubridate)
#>
#> Attaching package: 'lubridate'
#> The following object is masked from 'package:base':
#>
#> date
library(fuzzyjoin)
sessions = tribble(
~user_id, ~session_id, ~session_created_at,
1, 1, "2019-01-01T15:30:00",
1, 2, "2019-01-02T00:00:30",
1, 3, "2019-01-04T12:30:00"
) %>%
mutate_at("session_created_at", as_datetime)
tests = tribble(
~user_id, ~test_id, ~test_created_at, ~test_value,
1, 7, "2019-01-01T15:28:00", "foo",
1, 8, "2019-01-01T23:59:30", "bar"
) %>%
mutate_at("test_created_at", as_datetime) %>%
mutate(
start = test_created_at + hours(3),
end = test_created_at - hours(3)
)
sessions %>%
fuzzy_left_join(
tests,
by = c(
"user_id" = "user_id",
"session_created_at" = "start",
"session_created_at" = "end"
),
match_fun = list(`==`, `>=`, `<=`)
)
#> # A tibble: 3 x 9
#> user_id.x session_id session_created_at user_id.y test_id
#> <dbl> <dbl> <dttm> <dbl> <dbl>
#> 1 1 1 2019-01-01 15:30:00 NA NA
#> 2 1 2 2019-01-02 00:00:30 NA NA
#> 3 1 3 2019-01-04 12:30:00 NA NA
#> # … with 4 more variables: test_created_at <dttm>, test_value <chr>,
#> # start <dttm>, end <dttm>
Создано в 2019-05-17 с помощью пакета Представить (v0.2.1)
Почему это так, иЧто мне нужно сделать, чтобы заставить его работать?
Я должен добавить, что когда я запускаю:
sessions %>%
left_join(tests, by = c("user_id" = "user_id"))
Я получаю правильные столбцы, но, конечно, соединяются не правильные результаты теста.И когда я запускаю это, я получаю ожидаемые результаты, но это кажется неэффективным:
sessions %>%
left_join(tests) %>%
filter(test_created_at - hours(3) <= session_created_at) %>%
filter(test_created_at + hours(3) >= session_created_at)