data.table
Почему мой старый код не работает?
Поиск…
Вступление
уникальный и дублированный больше не работает с ключевыми данными.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.
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
Элис дубликат был удален.
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
Детали и стоп-исправление
Подробнее см. В пункте 1 в примечаниях к выпуску NEWS :
Изменения в v.1.9.8 (по CRAN 25 ноября 2016 года)
ПОТЕНЦИАЛЬНЫЕ ИЗМЕНЕНИЯ
- По умолчанию все столбцы теперь используются
unique()
,duplicated()
иuniqueN()
методами data.table, # 1284 и # 1841. Для восстановления старого поведения:options(datatable.old.unique.by.key=TRUE)
. Через 1 год этот параметр для восстановления старого значения устаревания будет устаревать с предупреждением. Через 2 года опция будет удалена. Для ясности явным образом передаюby=key(DT)
. Это зависит только от кода, который зависит от значения по умолчанию. 266 пакетов CRAN и Bioconductor с использованием data.table были проверены перед выпуском. 9 необходимо было изменить и были уведомлены. Эти строки проверяются любыми строками кода без тестового покрытия. Любые пакеты, не входящие в CRAN или Bioconductor, не проверялись.
Таким образом, вы можете использовать параметры в качестве временного обходного пути, пока ваш код не будет исправлен.
options(datatable.old.unique.by.key=TRUE)