data.table
Warum funktioniert mein alter Code nicht?
Suche…
Einführung
unique und duplicated funktioniert bei keyed data.table nicht mehr
Dies ist für diejenigen, die zu data.table> = 1.9.8 wechseln
Sie haben einen Datensatz von Tierbesitzern und -namen, vermuten jedoch, dass wiederholt Daten erfasst wurden.
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
Wenn Sie eine Tabelle neu eingeben, wird sie sortiert. Alice wurde zweimal eingegeben.
> 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
Angenommen, Sie haben " unique
, um Duplikate in Ihren Daten basierend auf dem Schlüssel zu entfernen, und verwenden Sie das letzte Datum der Datenerfassung, indem Sie "Last" auf TRUE setzen.
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
Alice-Duplikat wurde entfernt.
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
Das funktioniert nicht. Noch 4 Reihen!
Fix
Verwenden Sie den by=
-Parameter, der nicht mehr standardmäßig auf Ihren Schlüssel, sondern auf alle Spalten angewendet wird.
clean.DT <- unique(DT, by = key(DT), fromLast = TRUE)
Nun ist alles gut.
> clean.DT
pet owner entry.date
1: dog Alice 14/2/2016
2: dog Bob 31/12/2015
3: cat Charlie 14/2/2016
Details und Überbrückung
Weitere Informationen finden Sie in Punkt 1 der NEWS- Versionshinweise:
Änderungen in v1.9.8 (am CRAN 25 Nov 2016)
MÖGLICHE BRECHENDE ÄNDERUNGEN
- Standardmäßig werden jetzt alle Spalten von den Methoden
unique()
,duplicated()
unduniqueN()
data.table (# 1284 und # 1841) verwendet. Um das alte Verhalten wiederherzustellen:options(datatable.old.unique.by.key=TRUE)
. In 1 Jahr wird diese Option zum Wiederherstellen der alten Standardeinstellung mit Warnung verworfen. In 2 Jahren wird die Option entfernt. Bitte übergeben Sie zur Klarheit explizit dieby=key(DT)
. Es ist nur Code betroffen, der sich auf den Standard bezieht. 266 CRAN- und Bioconductor-Pakete mit data.table wurden vor der Veröffentlichung geprüft. 9 mussten geändert werden und wurden benachrichtigt. Alle Codezeilen ohne Testabdeckung wurden bei diesen Prüfungen nicht berücksichtigt. Pakete, die nicht auf CRAN oder Bioconductor basieren, wurden nicht geprüft.
Daher können Sie die Optionen als temporäre Problemumgehung verwenden, bis der Code behoben ist.
options(datatable.old.unique.by.key=TRUE)