【发布时间】: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有重复,这将是一个问题。请检查您是否通过独特元素加入