Sök…


Introduktion

Paketet data.table har genomgått ett antal förändringar och innovationer över tid. Här är några potentiella fallgropar som kan hjälpa användare att titta på äldre kod eller granska gamla blogginlägg.

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.

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

Alice duplikat har tagits bort.

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

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

  1. Som standard används nu alla kolumner med unique() , duplicated() och uniqueN() 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 passera by=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)


Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow