data.table
Varför fungerar inte min gamla kod?
Sök…
Introduktion
unik och duplicerad fungerar inte längre på keyed data.table
Detta är för dem som flyttar till data.table> = 1.9.8
Du har en datauppsättning av husdjursägare och namn, men du misstänker att vissa upprepade uppgifter har fångats.
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
Återkallelse genom att koda in en tabell kommer att sortera den. Alice har gått in två gånger.
> 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
Säg att du använde unique
för att bli av med duplikat i dina data baserat på nyckeln, med det senaste datafångstdatumet genom att ställa in från Sista till SANT.
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 har tagits bort.
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
Det här fungerar inte. Fortfarande 4 rader!
Fixera
Använd parametern by=
som inte längre är standard för din nyckel utan för alla kolumner.
clean.DT <- unique(DT, by = key(DT), fromLast = TRUE)
Nu är allt bra.
> clean.DT
pet owner entry.date
1: dog Alice 14/2/2016
2: dog Bob 31/12/2015
3: cat Charlie 14/2/2016
Detaljer och fixeringsstopp
Se punkt 1 i NEWS release-anteckningar för detaljer:
Förändringar i v1.9.8 (på CRAN 25 nov 2016)
Potentiellt brytande förändringar
- Som standard används nu alla kolumner med
unique()
,duplicated()
ochuniqueN()
data.table-metoder, # 1284 och # 1841. För att återställa gammalt beteende:options(datatable.old.unique.by.key=TRUE)
. Om ett år kommer detta alternativ att återställa den gamla standardinställningen att avskrivas med varning. Om två år kommer alternativet att tas bort. Vänligen uttryckligen passeraby=key(DT)
för tydlighet. Endast kod som är beroende av standard påverkas. 266 CRAN- och Bioconductor-paket med data.table kontrollerades före utsläpp. 9 behövde ändras och meddelades. Eventuella kodrader utan testtäckning har missats av dessa kontroller. Alla paket som inte finns på CRAN eller Bioconductor kontrollerades inte.
Så du kan använda alternativen som en tillfällig lösning tills din kod är fixad.
options(datatable.old.unique.by.key=TRUE)