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