唯一且重复的不再适用于键控 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)