gpt4 book ai didi

r - 使用 data.table : column missing from the output 的非 equi 连接

转载 作者:行者123 更新时间:2023-12-03 23:25:47 29 4
gpt4 key购买 nike

我正在使用 data.table 进行左非等连接:

OUTPUT <- DT2[DT1, on=.(DOB, FORENAME, SURNAME, POSTCODE, START_DATE <= MONTH, EXPIRY_DATE >= MONTH)]
OUTPUT包含正确的左连接,除了 MONTH列(存在于 DT1 中)丢失。

这是 data.table 中的错误吗? ?

注意:当然, START_DATE , EXPIRY_DATEMONTH采用相同的 YYYY-MM-DD,IDate 格式。根据这些非 equi 标准,连接的结果是正确的。只是缺少该列,我需要在进一步的工作中使用它。

编辑 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
  • FORENAMESURNAME加入并出现在输出中。
  • 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

    编辑 2 :显然在我的代码产生的输出中,开始和结束日期也是错误的!只有人 1 的证书开始日期为 1 月 1 日,结束日期为 12 月 31 日!预期的输出是应该的。但实际输出使一切都在 1 月 1 日。

    最佳答案

    在 data.table 中,x[i] 形式的连接传统上使用 i 中的值但使用 x 中的列名.尽管这与返回两者的 SQL 不同,但这个默认值对于 equi 连接很有意义,因为我们对 i 中的所有行感兴趣。如果它们匹配,那么两个 data.table 无论如何都具有相同的值,如果它们不匹配,我们需要保留 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)]

    IIRC 在 GitHub 项目页面上也有关于此的问题。

    关于r - 使用 data.table : column missing from the output 的非 equi 连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44282044/

    29 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com