唯一且重複的不再適用於鍵控 data.table

這適用於那些轉向 data.table> = 1.9.8 的人

你有寵物所有者和名稱的資料集,但你懷疑已捕獲了一些重複資料。

library(data.table)
DT <- data.table(pet = c("dog","dog","cat","dog"),
                 owner = c("Alice","Bob","Charlie","Alice"),
                 entry.date = c("31/12/2015","31/12/2015","14/2/2016","14/2/2016"),
                 key = "owner")

> tables()
     NAME NROW NCOL MB COLS                 KEY  
[1,] DT      4    3  1 pet,owner,entry.date owner
Total: 1MB

召回鍵表將對其進行排序。愛麗絲已經兩次進入。

> DT
   pet   owner entry.date
1: dog   Alice 31/12/2015
2: dog   Alice  14/2/2016
3: dog     Bob 31/12/2015
4: cat Charlie  14/2/2016

假設你使用 unique 根據金鑰刪除資料中的重複項,使用最新的資料捕獲日期,將 fromLast 設定為 TRUE。

Version < 1.9.8

clean.DT <- unique(DT, fromLast = TRUE)

> tables()
    NAME     NROW NCOL MB COLS                 KEY  
[1,] clean.DT    3    3  1 pet,owner,entry.date owner
[2,] DT          4    3  1 pet,owner,entry.date owner
Total: 2MB

愛麗絲複製已刪除。

Version >= 1.9.8

clean.DT <- unique(DT, fromLast = TRUE)

> tables()
     NAME     NROW NCOL MB COLS                 KEY  
[1,] clean.DT    4    3  1 pet,owner,entry.date owner
[2,] DT          4    3  1 pet,owner,entry.date owner

這不起作用。還是 4 排!

固定

使用 by= 引數**,該引數不再預設為你的金鑰,而是預設**為所有列。

clean.DT <- unique(DT, by = key(DT), fromLast = TRUE)

現在一切都很好。

> clean.DT
   pet   owner entry.date
1: dog   Alice  14/2/2016
2: dog     Bob 31/12/2015
3: cat Charlie  14/2/2016

細節和權宜之計修復

有關詳細資訊,請參閱 NEWS 發行說明中的​​第 1 項

v1.9.8 的變化(2016 年 11 月 25 日 CRAN)

可能突破的變化

  1. 預設情況下,unique()duplicated()uniqueN() data.table 方法,#1284 和#1841 現在使用所有列。恢復舊的行為:options(datatable.old.unique.by.key=TRUE)。在 1 年內,將使用此選項恢復舊的預設值併發出警告。在 2 年內,該選項將被刪除。為清楚起見,請明確傳遞 by=key(DT)。只有依賴於預設值的程式碼才會受到影響。在釋出之前檢查了 266 個使用 data.table 的 CRAN 和 Bioconductor 包。9 需要改變並得到通知。這些檢查將錯過任何沒有測試覆蓋的程式碼行。未檢查任何不在 CRAN 或 Bioconductor 上的包。

因此,你可以使用這些選項作為臨時解決方法,直到你的程式碼得到修復。

options(datatable.old.unique.by.key=TRUE)