デカルトにつながる

Oct 14 2020

私は2つのDTを持っています。列に基づいて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( 'place')、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に同じ日付の複数の行があるためですか?

2番目-これを正しく達成するにはどうすればよいですか?

また、内部結合の代わりに右外部結合を試しました。同じエラーが発生します。

回答

1 akrun Oct 14 2020 at 13:48

我々はできる

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