唯一且重複的不再適用於鍵控 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)
可能突破的變化
- 預設情況下,
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)