Поиск…


Вступление

Пакет 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.

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

Элис дубликат был удален.

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

Детали и стоп-исправление

Подробнее см. В пункте 1 в примечаниях к выпуску NEWS :

Изменения в v.1.9.8 (по CRAN 25 ноября 2016 года)

ПОТЕНЦИАЛЬНЫЕ ИЗМЕНЕНИЯ

  1. По умолчанию все столбцы теперь используются 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)


Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow