Соединение ведет к декартовой системе координат

У меня два ДТ. Я хочу соединить DT1 с DT2 на основе столбца и взять столбец из DT2.

DT1:
         id  place
     1: id1    A
     2: id2    B
     3: id3    B
     4: id4    C
     5: id5    C

DT2:

      place rank
   1:  A      3
   2:  B      2
   3:  C      1
   4:  D      3
   5:  E      2

Expected:

         id  place  rank
     1: id1    A       3
     2: id2    B       2
     3: id3    B       2
     4: id4    C       1 
     5: id5    C       1 

Прямо сейчас я попробовал -

dt1 [dt2, on = c ('место'), nomatch = 0]

Я думал, что это отобразит все строки на основе значения в столбце place и добавит к нему столбец rank. Но я получаю сообщение об ошибке декартова.

Error in vecseq(f__, len__, if (allow.cartesian || notjoin || !anyDuplicated(f__,  :
  Join results in <> rows; more than <> = nrow(x)+nrow(i). 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 al
location. If you are sure you wish to proceed, rerun with allow.cartesian=TRUE. Otherwise, please search for this error message in the FAQ, Wiki, Stack Overflow and data.table issue tracker for advice.

Мой первый вопрос: я не понимаю, как здесь образуется декартова система? Это потому, что в моем первом DT есть несколько строк на одну и ту же дату?

Во-вторых, как мне этого добиться правильно?

Я также пробовал правое внешнее соединение вместо внутреннего. Я получаю ту же ошибку.


person leoOrion    schedule 14.10.2020    source источник
comment
Вы можете указать allow.cartesian = TRUE   -  person akrun    schedule 14.10.2020
comment
Но как мне предотвратить декартово? Предположим, у моего dt 1500 строк. После присоединения я все еще ожидаю 1500 строк   -  person leoOrion    schedule 14.10.2020
comment
Судя по примеру, это не выдает ошибки. Может быть, есть обманщики, и это создает проблему   -  person akrun    schedule 14.10.2020
comment
ты имел ввиду дурак в dt2?   -  person leoOrion    schedule 14.10.2020
comment
если у соединения on есть дубликаты, это будет проблемой. Пожалуйста, проверьте, присоединяетесь ли вы по уникальному элементу   -  person akrun    schedule 14.10.2020
comment
Проверьте проверку place в обоих наборах данных dt1[, .N, place] и dt2[, .N, place]   -  person akrun    schedule 14.10.2020
comment
dt1 имеет несколько строк с одним и тем же разрядным значением. dt2 нет.   -  person leoOrion    schedule 14.10.2020
comment
если вы хотите сопоставить только первый экземпляр, используйте mult = 'first', а затем выполните присвоение (:=), т.е. dt1[dt2, on = .(place), rank := rank, mult = 'first']   -  person akrun    schedule 14.10.2020


Ответы (1)


Мы сможем

library(data.table)
dt1[dt2, on = .(place), rank := rank, mult = 'first']
person akrun    schedule 14.10.2020