R: объединить две таблицы (таблицы) по * списку * столбцов

Похоже, на это должен быть простой ответ, но я не смог его найти:

tib1 <- tibble(x = list(1, 2, 3), y = list(4, 5, 6))
tib1
# A tibble: 3 × 2
      x         y
 <list>    <list>
1 <dbl [1]> <dbl [1]>
2 <dbl [1]> <dbl [1]>
3 <dbl [1]> <dbl [1]>

tib2 <- tibble(x = list(1, 2, 4, 5), y = list(4, c(5, 10), 6, 7))
tib2
# A tibble: 4 × 2
      x         y
 <list>    <list>
1 <dbl [1]> <dbl [1]>
2 <dbl [1]> <dbl [2]>
3 <dbl [1]> <dbl [1]>
4 <dbl [1]> <dbl [1]>

dplyr::inner_join(tib1, tib2)

Присоединение, by = c ("x", "y")

Ошибка в inner_join_impl (x, y, by $ x, by $ y, суффикс $ x, суффикс $ y): невозможно присоединиться к 'x' x 'x' из-за несовместимых типов (список / список)

Итак, есть ли способ выполнить соединение на основе столбцов list (прежде чем я начну писать свои собственные)?

В основном, если список обеих ключевых переменных идентичен, я хочу, чтобы строка была включена в итоговую таблицу, а если нет - нет. В приведенном выше примере есть две ключевые переменные x и y, и результатом должна быть только первая строка из двух tibble, поскольку она единственная идентичная в обеих ключевых переменных:

tibble(x = list(1), y = list(4))
# A tibble: 1 × 2
      x         y
 <list>    <list>
1 <dbl [1]> <dbl [1]>

person Giora Simchoni    schedule 10.05.2017    source источник
comment
Так есть ли способ выполнить соединение на основе столбцов списка, я так не думаю, нет. Вы можете сначала вычислить уникальный идентификатор и присоединиться к нему.   -  person Axeman    schedule 10.05.2017


Ответы (1)


Мы могли бы использовать хеши из digest:

tib1 <- tibble(x = list(1, 2, 3), y = list(4, 5, 6))
tib2 <- tibble(x = list(1, 2, 4, 5), y = list(4, c(5, 10), 6, 7))

tib1 <- mutate_all(tib1, funs(hash = map_chr(., digest::digest)))
tib2 <- mutate_all(tib2, funs(hash = map_chr(., digest::digest)))

inner_join(tib1, tib2, c('x_hash', 'y_hash')) %>%
  select(x.x, x.y)
# A tibble: 1 × 2
        x.x       x.y
     <list>    <list>
1 <dbl [1]> <dbl [1]>
person Axeman    schedule 10.05.2017
comment
Хорошо, я просто написал что-то похожее, как мы говорим: uniqueIdentifier <- function(l) paste(sort(l), collapse = " ") и также использовал map_chr. - person Giora Simchoni; 10.05.2017
comment
У нас может быть ошибка, когда, скажем, второй элемент в tib1 y равен c(10, 5), что означает c(5, 10) в другом порядке. Если пользователю не важен порядок (в моем случае это правда), вашему методу требуется дополнительный sort, как в моей функции. - person Giora Simchoni; 10.05.2017