【问题标题】:Join leads to cartesian加入导致笛卡尔
【发布时间】:2020-10-14 06:36:40
【问题描述】:

我有两个 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 在同一日期有多行吗?

第二 - 我如何正确地做到这一点?

我也尝试了右外连接而不是内连接。我得到同样的错误。

【问题讨论】:

  • 可以指定allow.cartesian = TRUE
  • 但是我如何防止笛卡尔?假设我的 dt 有 1500 行。加入后,我仍然期望 1500 行
  • 基于示例,它没有给出错误。可能有骗子,这会造成问题
  • 你的意思是 dt2 中的骗子吗?
  • 如果加入 on 有重复,这将是一个问题。请检查您是否通过独特元素加入

标签: r join cartesian


【解决方案1】:

我们可以的

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

【讨论】:

    猜你喜欢
    • 2015-07-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-18
    相关资源
    最近更新 更多