Нечеткое объединение с R создает повторяющиеся столбцы и не объединяет значения - PullRequest
1 голос
/ 17 мая 2019

Я адаптирую пример , показанный здесь , где я хотел бы присоединить некоторые результаты теста к существующим данным сеанса, но я знаю, что тесты могли проводиться за три часа до или послесеанс был создан тем же пользователем.

Однако в результате я получаю дубликаты столбцов 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)

1 Ответ

0 голосов
/ 16 июля 2019

Я узнал, что это для дизайна :

[…] Предположение о дизайне заключается в том, что во время нечеткого объединения полезно иметь возможность обеих сторон объединениячтобы понять, как оно совпало, и нет особой логики для обработки их свертывания на равенство.

Пока не реализована такая логика дедупликации, все, что вы можете сделать, - это пойти дальше и удалить все столбцы, которые, как вы знаете, являются дубликатами,например, на select(-ends_with(".y")) и переименование тех, которые заканчиваются на .x, чтобы потерять их суффикс.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...