data.table
Dlaczego mój stary kod nie działa?
Szukaj…
Wprowadzenie
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.
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.
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
- Domyślnie wszystkie kolumny są teraz używane przez metody
unique()
,duplicated()
iuniqueN()
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)