неравнозначные самосоединяющиеся данные.ошибка таблицы «vecseq(f__, len__, если (разрешить.декартово || не соединено || !любое дублирование(f__,»

#r #data.table #self-join #non-equi-join

Вопрос:

Я пытаюсь выполнить неравномерное объединение с data.table в таблице, содержащей 2 миллиона строк и 8 переменных. данные выглядят следующим образом:

 db table :
product     position_min     position_max      count_pos
A.16        167804              167870              20
A.18        167804              167838              15
A.15        167896              167768              18
A.20        238359              238361              33
A.35        167835              167837              8

dt table:
product_t   position_min_t     position_max_t      count_pos_t
A.16        167804              167870              20
A.18        167804              167838              15
A.15        167896              167768              18
A.20        238359              238361              33
A.35        167835              167837              8
 

Вот код, который я использовал:

 db_join <- db[dt, .(product, product_t, position_min_t, position_max_t, count_pos_t), on = .(position_min <= position_min_t, position_max >=  position_max_t)]
 

Я должен получить:

 A16        A18          167804              167838              15
A16        A15          167896              167768              18
A16        A35          167835              167837              8
A18        A35          167835              167837              8
 

но я продолжаю получать эту ошибку

 Error in vecseq(f__, len__, if (allow.cartesian || notjoin || !anyDuplicated(f__,  : 
  Join results in more than 2^31 rows (internal vecseq reached physical limit). Very likely misspecified join. Check for duplicate key values in i each of which join to the same group in x over and over again. If that's ok, try by=.EACHI to run j for each group to avoid the large allocation. Otherwise, please search for this error message in the FAQ, Wiki, Stack Overflow and data.table issue tracker for advice.
 

Я установил значение allow.cartesian TRUE и добавил by=.EACHI , что это все еще не работает.
Я попробовал тот же код на подмножестве таблицы с 1,6 миллионами строк, и это сработало как заклинание.
У вас есть какие-нибудь идеи о том, как это исправить ?
Любая помощь была бы очень признательна

Комментарии:

1. Настройка allow.cartesian=TRUE не фиксирует слишком большие соединения, это просто механизм, позволяющий вам сказать data.table , что вы в порядке с «взрывным количеством строк». Когда вы запустили его на вводе 1,6 млн строк, сколько строк вы получили? Есть ли что-то в удаленных 400 тыс. строк, что могло бы значительно изменить геометрию соединения?

2. Спасибо вам за ваш ответ @r2evans. Я получаю 28 М строк при выполнении соединения в подмножестве 1,6 М. линии 400 Тыс. ничем не отличаются от 1,6 М. Я не вижу никакой разницы между 400 тыс. и 1,6 М.

3. Хотя я понимаю, что это не приведет к такой же ошибке с меньшими данными, можно ли предоставить репрезентативные выборочные данные, чтобы проверить, что делает механика соединения?

4. конечно, я отредактирую свой вопрос и добавлю образец данных

5. Даже если этот пример не генерирует эту ошибку, это тоже не соответствует вашим ожиданиям, возвращение 11 рядов вместо 4. На основе вашего вывода, я подразумеваю добавление [product != product_t,] после присоединения бы помочь, но что до сих пор производит пары у вас нет, а именно A.18 A.15 и A.35 A.15 , которые отвечают других ограничений. Можете ли вы расширить свои правила относительно того, почему эти две строки должны быть исключены? (Кстати, удаление » где product == product_t » не исправит вашу ошибку, так как это сокращение после присоединения, не знаю, как лучше всего это учесть.)