使用data.table:输出中缺少列的非equi连接

Mih*_*ael 13 join r left-join data.table

我使用data.table以下方法进行左非等连接:

OUTPUT <- DT2[DT1, on=.(DOB, FORENAME, SURNAME, POSTCODE, START_DATE <= MONTH, EXPIRY_DATE >= MONTH)]
Run Code Online (Sandbox Code Playgroud)

OUTPUT包含正确的左连接,与该异常MONTH列(这是目前在DT1)的缺失.

这是一个错误data.table吗?

注:当然,START_DATE,EXPIRY_DATEMONTH在同一个YYYY-MM-DD,IDATE格式.基于这些非等标准,连接的结果是正确的.只是缺少该列,我需要在进一步的工作中使用它.

编辑1:简化的可重复示例

DT1 <- structure(list(ID = c(1, 2, 3), FORENAME = c("JOHN", "JACK", 
"ROB"), SURNAME = c("JOHNSON", "JACKSON", "ROBINSON"), MONTH = structure(c(16953L, 
16953L, 16953L), class = c("IDate", "Date"))), .Names = c("ID", 
"FORENAME", "SURNAME", "MONTH"), row.names = c(NA, -3L), class = c("data.table", 
"data.frame"))

DT2 <- structure(list(CERT_NUMBER = 999, FORENAME = "JOHN", SURNAME = "JOHNSON", 
    START_DATE = structure(16801L, class = c("IDate", "Date")), 
    EXPIRY_DATE = structure(17166L, class = c("IDate", "Date"
    ))), .Names = c("CERT_NUMBER", "FORENAME", "SURNAME", "START_DATE", 
"EXPIRY_DATE"), row.names = c(NA, -1L), class = c("data.table", 
"data.frame"))

OUTPUT <- DT2[DT1, on=.(FORENAME, SURNAME, START_DATE <= MONTH, EXPIRY_DATE >= MONTH)]

> OUTPUT
   CERT_NUMBER FORENAME  SURNAME START_DATE EXPIRY_DATE ID
1:         999     JOHN  JOHNSON 2016-06-01  2016-06-01  1
2:          NA     JACK  JACKSON 2016-06-01  2016-06-01  2
3:          NA      ROB ROBINSON 2016-06-01  2016-06-01  3
Run Code Online (Sandbox Code Playgroud)
  • FORENAME并且SURNAME在输出中存在并存在.
  • MONTH 也是(非equi)加入,并且不在输出中.

为什么这是预期的行为?

即使它是预期的行为,在我的情况下也没有用,因为我需要保留MONTH进一步的数据操作.

我的预期输出将是同一个表,但是该MONTH列保留在DT1中.毕竟,我对左连接的期望是从左表(DT1)和所有列中保留每个行和列,并且只从右表(DT2)添加匹配的行.

   CERT_NUMBER FORENAME  SURNAME START_DATE EXPIRY_DATE ID      MONTH
1:         999     JOHN  JOHNSON 2016-01-01  2016-12-31  1 2016-06-01
2:          NA     JACK  JACKSON       <NA>        <NA>  2 2016-06-01
3:          NA      ROB ROBINSON       <NA>        <NA>  3 2016-06-01
Run Code Online (Sandbox Code Playgroud)

编辑2:显然在我的代码产生的输出中,START和END日期也是错误的!只有1人拥有证书,其开始日期为1月1日,结束日期为31日至12月!预期的产出应该是应有的.但是实际产量在1月1日完成.

Aru*_*run 22

在data.table中,表单的连接x[i]传统上使用来自i但是使用来自的列名称x.虽然这与返回两者的SQL不同,但是这个默认值对于equi连接很有意义,因为我们对所有行感兴趣i,如果它们匹配,那么两个data.tables都有相同的值,如果不是,我们需要i在结果中保留那些不匹配的值.

但是对于非equi连接,由于值可能不完全匹配,即可能落在一个范围内,可能会出现我们必须返回类似于SQL的输出(或识别此类情况并返回用户期望的结果,类似对于equi连接的情况).这还没有完成,但我现在已经为它提供了一个规定,即用明确的x.前缀来引用列.我同意,这不方便.希望这将很快自动完成.

以下是使用x.前缀获取结果的方法.

ans <- DT2[DT1, .(CERT_NUMBER, FORENAME, SURNAME, x.START_DATE, x.EXPIRY_DATE, ID, MONTH), 
         on=.(FORENAME, SURNAME, START_DATE <= MONTH, EXPIRY_DATE >= MONTH)]
Run Code Online (Sandbox Code Playgroud)

IIRC还有一个关于GitHub项目页面的问题.

  • 最新版本的 data.table 是否解决了这个问题?或者如何使用最新版本解决此问题? (2认同)