xlab - r plot title



非平等聯接使用data.table:從輸出中丟失的列 (1)

我正在做一個使用data.table的左邊非equi加入:

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

OUTPUT包含正確的左連接,除了MONTH列(存在於DT1中)丟失。

這是data.table的錯誤嗎?

注意:當然, START_DATEEXPIRY_DATEMONTH格式是相同的YYYY-MM-DD。 加入的結果是正確的基於這些非平等的標準。 這只是列丟失,我需要使用它在進一步的工作。

編輯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也是(non-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日和12月31日結束的證書! 預期的產出是應該的。 但實際產出使得1月1日的一切


在data.table中,形式x[i]傳統上使用來自i值,但使用x列名。 即使這與返回兩者的SQL不同,這個默認對於equi連接有很大的意義,因為我們對來自i所有行感興趣,如果它們匹配,那麼兩個data.tables都有相同的值,如果它們不我們需要保留那些來自i不匹配值。

但對於非平等聯接,由於值可能不完全匹配,即可能落在一個範圍內,所以可能會出現這樣的情況,我們將不得不返回類似於SQL的輸出(或者識別這種情況並返回用戶期望的結果,類似到equi連接的情況)。 這還沒有完成,但是我現在已經為它提供了一個規定,就是明確地用x.來引用列x. 字首。 這是不方便的,我同意。 希望這會很快自動處理。

以下是如何使用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項目頁面上也提到了這個問題。





left-join