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
j
in[.data.table
fundamenteel
verschillend vanj
in[.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.table
vandata.frame
. Het is een
data.frame
ook. Eendata.table
kan worden doorgegeven aan elk pakket dat:
accepteert alleendata.frame
en dat pakket kan[.data.frame
gebruiken
syntaxis op dedata.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()
enmatch()
zijn nu sneller op tekenvectoren waarbij alle elementen zich in de globaleCHARSXP
-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 inunique.
c.Een tweede voorstel was om
memcpy
te gebruiken induplicate.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.frame
en data.table
DT[3]
verwijst naar de 3e rij, maarDF[3]
verwijst naar de 3e kolomDT[3, ] == DT[3]
, maarDF[ , 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 inDF
DT[[3]] == DF[, 3] == DF[[3]]
DT[i, ]
, waarbiji
een enkel geheel getal is, geeft een enkele rij terug, net alsDF[i, ]
, maar in tegenstelling tot een matrix met één rij die een vector retourneert.DT[ , j]
waarbijj
een enkel geheel getal is, retourneert een data.table met één kolom, in tegenstelling totDF[, j]
die standaard een vector retourneertDT[ , "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 vanNA
, maarDF[NA]
retourneert een volledige kopie vanDF
met overalNA
. Het symboolNA
is van het typelogical
in R en wordt daarom hergebruikt door[.data.frame
. De bedoeling van de gebruiker was waarschijnlijkDF[NA_integer_]
.[.data.table
leidt voor het gemak automatisch naar deze waarschijnlijke bedoeling.DT[c(TRUE, NA, FALSE)]
behandelt deNA
alsFALSE
, maarDF[c(TRUE, NA, FALSE)]
retourneert
NA
rijen voor elkeNA
DT[ColA == ColB]
is eenvoudiger danDF[!is.na(ColA) & !is.na(ColB) & ColA == ColB, ]
data.frame(list(1:2, "k", 1:4))
maakt 3 kolommen, data.table maakt éénlist
kolom.check.names
is standaardTRUE
indata.frame
maarFALSE
in data.table, voor gemak.stringsAsFactors
is standaardTRUE
indata.frame
maarFALSE
in 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 naarfactor
.- Atoomvectoren in
list
kolommen worden samengevouwen wanneer ze worden afgedrukt met", "
indata.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.frame
stellen we heel vaakdrop = FALSE
in. 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 kolomdata.frame
. In[.data.table
hebben we van de gelegenheid gebruik gemaakt om het consistent te maken en hebben wedrop
laten 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.table
constant wordt onderhouden om dergelijke problemen te voorkomen, kunnen eventuele problemen ontstaan zal snel worden opgelost.
Bijvoorbeeld
-
Uit het NIEUWS voor v 1.8.2
- 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.