Wat kunt u met een data.frame wat u niet kunt met een data.table?

Ik ben net begonnen met het gebruik van R en kwam data.table tegen. Ik vond het briljant.

Een zeer naïeve vraag: kan ik data.frame negeren om data.table te gebruiken om syntaxisverwarring tussen twee pakketten te voorkomen?


Antwoord 1, autoriteit 100%

Van de veelgestelde vragen over data.table

FAQ 1.8 OK, ik begin te begrijpen waar data.table over gaat, maar waarom heb je data.frame niet verbeterd in R? Waarom moet het een nieuw pakket zijn?

Zoals FAQ 1.1 benadrukt, is jin [.data.tablefundamenteel
verschillend van jin [.data.frame. Zelfs zoiets eenvoudigs als
DF[,1]zou bestaande code in veel pakketten en gebruikerscode breken.
Dit is zo ontworpen en we willen dat het op deze manier werkt voor meer
ingewikkelde syntaxis om te werken. Er zijn ook andere verschillen (zie FAQ
2.17).

Bovendien erft data.tablevan data.frame. Het is een
data.frameook. Een data.tablekan worden doorgegeven aan elk pakket dat:
accepteert alleen data.frameen dat pakket kan [.data.framegebruiken
syntaxis op de data.table.

We hebben waar mogelijk ook verbeteringen aan R voorgesteld. Een van de
deze zijn geaccepteerd als een nieuwe functie in R 2.12.0:

unique()en match()zijn nu sneller op tekenvectoren waarbij alle elementen zich in de globale CHARSXP-cache bevinden en niet zijn gemarkeerd
codering (ASCII). Met dank aan Matthew Dowle voor het voorstellen van verbeteringen
naar de manier waarop de hash-code wordt gegenereerd in unique.c.

Een tweede voorstel was om memcpyte gebruiken in duplicate.c, wat veel
sneller dan een for-lus in C. Dit zou de manier verbeteren waarop R kopieert
gegevens intern (op sommige maatregelen met 13 keer). De draad op r-devel
is hier: http://tolstoy.newcastle.edu. au/R/e10/devel/10/04/0148.html.

Wat zijn de kleinere syntaxisverschillen tussen data.frameen data.table

  • DT[3]verwijst naar de 3e rij, maar DF[3]verwijst naar de 3e kolom
  • DT[3, ] == DT[3], maar DF[ , 3] == DF[3](enigszins verwarrend in data.frame, terwijl data.table is consistent)
  • Om deze reden zeggen we dat de komma optioneelis in DT, maar niet optioneel in DF
  • DT[[3]] == DF[, 3] == DF[[3]]
  • DT[i, ], waarbij ieen enkel geheel getal is, geeft een enkele rij terug, net als DF[i, ], maar in tegenstelling tot een matrix met één rij die een vector retourneert.
  • DT[ , j]waarbij jeen enkel geheel getal is, retourneert een data.table met één kolom, in tegenstelling tot DF[, j]die standaard een vector retourneert
  • DT[ , "colA"][[1]] == DF[ , "colA"].
  • DT[ , colA] == DF[ , "colA"](momenteel in data.table v1.9.8 maar staat op het punt te veranderen, zie release-opmerkingen)
  • DT[ , list(colA)] == DF[ , "colA", drop = FALSE]
  • DT[NA]retourneert 1 rij van NA, maar DF[NA]retourneert een volledige kopie van DFmet overal NA. Het symbool NAis van het type logicalin R en wordt daarom hergebruikt door [.data.frame. De bedoeling van de gebruiker was waarschijnlijk DF[NA_integer_]. [.data.tableleidt voor het gemak automatisch naar deze waarschijnlijke bedoeling.
  • DT[c(TRUE, NA, FALSE)]behandelt de NAals FALSE, maar DF[c(TRUE, NA, FALSE)]retourneert
    NArijen voor elke NA
  • DT[ColA == ColB]is eenvoudiger dan DF[!is.na(ColA) & !is.na(ColB) & ColA == ColB, ]
  • data.frame(list(1:2, "k", 1:4))maakt 3 kolommen, data.table maakt één listkolom.
  • check.namesis standaard TRUEin data.framemaar FALSEin data.table, voor gemak.
  • stringsAsFactorsis standaard TRUEin data.framemaar FALSEin data.table, voor efficiëntie. Aangezien er een globale tekenreekscache is toegevoegd aan R, zijn tekens-items een verwijzing naar de enkele tekenreeks in de cache en is er geen prestatievoordeel meer van het converteren naar factor.
  • Atoomvectoren in listkolommen worden samengevouwen wanneer ze worden afgedrukt met ", "in data.frame, maar ","in data.table met een volgkomma na het 6e item om te voorkomen dat er per ongeluk grote ingesloten objecten worden afgedrukt.
    In [.data.framestellen we heel vaak drop = FALSEin. Als we het vergeten, kunnen er bugs optreden in edge-gevallen waarbij enkele kolommen worden geselecteerd en plotseling een vector wordt geretourneerd in plaats van een enkele kolom data.frame. In [.data.tablehebben we van de gelegenheid gebruik gemaakt om het consistent te maken en hebben we droplaten vallen.
    Wanneer een data.table wordt doorgegeven aan een data.table-onbewust pakket, houdt dat pakket zich met geen van deze verschillen bezig; het werkt gewoon.

Kleine waarschuwing

Er zullen mogelijk gevallen zijn waarin sommige pakketten code gebruiken die naar beneden valt wanneer ze een data.frame krijgen, maar aangezien data.tableconstant wordt onderhouden om dergelijke problemen te voorkomen, kunnen eventuele problemen ontstaan ​​zal snel worden opgelost.

Bijvoorbeeld

  • base::unname(DT) werkt nu weer, zoals vereist door plyr::melt(). Dankzij
    Christoph Jaeckel voor rapportage. Test toegevoegd.
  • Er is een methode as.data.frame toegevoegd voor ITime, zodat ITime kan worden doorgegeven aan ggplot2
    zonder fout, #1713. Met dank aan Farrel Buchinsky voor het melden. Testen toegevoegd.
    ITime-aslabels worden nog steeds weergegeven als gehele seconden vanaf middernacht; we weten niet waarom ggplot2
    roept de as.character-methode van ITime niet aan. Converteer ITime naar POSIXct voor ggplot2, is een benadering.

Other episodes