Szukaj…


Wprowadzenie

Pakiet data.table przeszedł szereg zmian i innowacji w miarę upływu czasu. Oto niektóre potencjalne pułapki, które mogą pomóc użytkownikom przeglądać starszy kod lub przeglądać stare posty na blogu.

unikatowy i zduplikowany nie działa już na kluczowanych data.table

Dotyczy to osób przechodzących do data.table> = 1.9.8

Masz zestaw danych właścicieli i nazwisk zwierząt domowych, ale podejrzewasz, że niektóre dane zostały przechwycone.

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

Przypomnijmy, że kluczowanie tabeli posortuje ją. Alice została wpisana dwukrotnie.

> 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

Załóżmy, że użyłeś unique aby pozbyć się duplikatów danych na podstawie klucza, używając najnowszej daty przechwytywania danych, ustawiając z Ostatniej na PRAWDA.

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

Duplikat Alicji został usunięty.

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

To nie działa. Nadal 4 rzędy!

Naprawić

Użyj parametru by= , który nie jest już domyślnie ustawiony na klucz, ale na wszystkie kolumny.

clean.DT <- unique(DT, by = key(DT), fromLast = TRUE)

Teraz wszystko jest dobrze.

> clean.DT
   pet   owner entry.date
1: dog   Alice  14/2/2016
2: dog     Bob 31/12/2015
3: cat Charlie  14/2/2016

Szczegóły i naprawa stopgap

Szczegóły znajdują się w punkcie 1 informacji o wydaniu NEWS :

Zmiany w wersji 1.9.8 (w CRAN 25 listopada 2016)

POTENCJALNIE ZŁAMAJĄCE ZMIANY

  1. Domyślnie wszystkie kolumny są teraz używane przez metody unique() , duplicated() i uniqueN() data.table, # 1284 i # 1841. Aby przywrócić stare zachowanie: options(datatable.old.unique.by.key=TRUE) . Za 1 rok ta opcja przywrócenia starych ustawień domyślnych zostanie przestarzała z ostrzeżeniem. Za 2 lata opcja zostanie usunięta. Proszę jawnie przekazać by=key(DT) dla jasności. Wpływa to tylko na kod oparty na wartości domyślnej. Przed wydaniem sprawdzono 266 pakietów CRAN i Bioconductor korzystających z data.table. 9 potrzebowało zmiany i zostało powiadomionych. Wszystkie wiersze kodu bez pokrycia testowego zostaną pominięte przez te kontrole. Żadne pakiety nie na CRAN lub Bioconductor nie zostały sprawdzone.

Możesz więc użyć opcji jako tymczasowego obejścia, dopóki kod nie zostanie naprawiony.

options(datatable.old.unique.by.key=TRUE)


Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow