Eine Kundin erzählte mir kürzlich, dass sie die Base R-Funktion unique() nutzt, um Dubletten aus ihren Daten auszuschließen. Sie erhält damit das gewünschte Resultat, allerdings sei ihr Code zu langsam.
Zwei Ideen kamen mir, den Code zu beschleunigen:
1. Statt alle Spalten bei der Suche nach Dubletten zu berücksichtigen, müsste eine Auswahl an Spalten genügen - auch wenn die Daten über keine ID-Spalte verfügen. In Base R wechsele ich dafür zur duplicated()-Funktion.
2. Das data.table-Paket verfügt über eine eigene unique()-Funktion. Man muss ihr lediglich ein data.table-Objekt übergeben. Um sie nur auf einige Spalten anzuwenden, bietet sie das praktische by-Argument.
Mit ausgewählten Spalten konnte ich die Laufzeit um die Hälfte verkürzen. Der entscheidende Sprung gelang mit data.table: Auf alle Spalten angewendet, ist data.table um den Faktor 100 schneller als Base R! Mit ausgewählten Spalten bleibt immerhin noch eine 60fache Beschleunigung. Die maximale Beschleunigung (Base R, alle Spalten vs. data.table, ausgewählte Spalten) entsprach einem Faktor von 126. Das mag je nach Anwendungsfall (und evtl. Hardware) unterschiedlich sein. Wir können jedoch davon ausgehen, mit data.table deutlich zu gewinnen.
Hier wurde das bench-Paket für die Laufzeit-Messungen genutzt. Es hat einige Eigenschaften, die ich beim microbenchmark-Paket vermisste: Es gibt ausführlich Auskunft über den garbage collector, und es prüft automatisch, ob die Ergebnisse der verglichenen Funktionen tatsächlich übereinstimmen. Das kann entscheidend sein!
Den R-Code zum Video findet Ihr hier:
https://github.com/fjodor/unique
Blog:
https://statistik-dresden.de/statistik-blog
R Schulungen:
https://statistik-dresden.de/r-schulungen
Twitter:
https://twitter.com/StatistikInDD
Facebook:
https://www.facebook.com/statistikdresden/
Statistiken zu Musik-Charts:
https://www.youtube.com/playlist?list=PL4ZUlAlk7QifbzVe9GAIi4PaxXEgTkTT6
Тэги:
#rstats #data.table #bench #Benchmark #unique #Doubletten #Datenbereinigung #Base_R