You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Mutate sieht erst einmal wie eine map Funktion aus. Tatsächlich handelt es sich um eine Vektoroperation. D.h. es wird immer der gesamte Vektor an eine Funktion übergeben.
Das hat alle möglichen Vorteile. Leider muss diese Verarbeitung bei Funktionen berücksichtigt werden. Das kann bei selbstgeschrieben Funktionen aber ein Problem sein, wenn diese Funktionen einzelne Werte erwarten. In solchen Fällen führt mutate immer wieder zu Problemen mit kryptischen Fehlermeldungen über zu langen Vektoren usw.
Im Beispiel verwende ich str_c(). Ohne collapse = funktioniert diese Funktion wie erwartet, weil die Funktion speziell für die Verwendung in mutate und summarise entwickelt wurde. Sie führt eine Vektor-Wert-Unterscheidung durch. Für die meisten Fälle funktioniert das ganz gut, aber leider nicht immer.
Im Internet finden wir eine Menge Lösungen, die in solchen Fällen auf die map()-Funktionen der purrr-Bibliothek ausweichen. Das ist natürlich unschön. Eine andere Variante bietet die rowwise()
-Funktion von dplyr. Diese Funktion hat aber mehrere Probleme, so dass die Entwickler von dplyr empfehlen, diese Funktion nicht mehr zu verwenden. Eines dieser Probleme ist die Bearbeitungsgeschwindigkeit und ein zweites ist die unflexible Handhabung im dplyr-Programmiermodell.
Ich habe mich gefragt, wie wir innerhalb des dplyr-Modells zeilenweise Transformationen erzwingen können, ohne map-Funktionen bemühen zu müssen. Die Lösung greift auf das Konzept der Iteratoren zurück. Dieses Konzept ist in der modernen Programmierung wichtig, um Iterationen umzusetzen. Eine Iteration ähnelt im Ergebnis einer Schleife - nur eben ohne eine Schleife mit for, while oder eben map()/reduce(). Stattdessen definieren wir einen Iterator, der die Schritte angibt und arbeiten diesen Iterator ab.
Diese Technik weist jedem Datensatz einen eindeutigen Wert zu. Dieser. Wert steht hier im Vektor iterator. Anschliessend wird die Stichprobe entlang dieses Vektors gruppiert. Weil der Vektor für jeden Datensatz einen eindeutigen Wert erzeugt hat, besteht jede Gruppe genau aus einem Datensatz. Die anschliessende Transformation mit mutate() erhält damit jeweils immer nur Vektoren mit einem Element und nicht n()-Elementen ohne die Gruppierung.
Mit dieser Technik lassen sich auch verschachtelte Operationen mit mehreren Iteratoren realisieren. Dabei müssen wir beachten, dass der innerste Iterator immer genau einen Datensatz umfasst und wir nach aussen immer mehr Datensätze zusammenfassen. Für diese Technik verwenden wir ebenfalls Gruppierungen. Weil wir aber für äussere Iteratoren normalerweise Variablenbezogene Bedingungen verwenden, müssen wir keine zusätzlichen Iteratoren einführen, sondern können uns auf den Zeileniterator konzentrieren.
The text was updated successfully, but these errors were encountered:
Mutate sieht erst einmal wie eine map Funktion aus. Tatsächlich handelt es sich um eine Vektoroperation. D.h. es wird immer der gesamte Vektor an eine Funktion übergeben.
bsp.
Das Ergebnis ist
Das hat alle möglichen Vorteile. Leider muss diese Verarbeitung bei Funktionen berücksichtigt werden. Das kann bei selbstgeschrieben Funktionen aber ein Problem sein, wenn diese Funktionen einzelne Werte erwarten. In solchen Fällen führt
mutate
immer wieder zu Problemen mit kryptischen Fehlermeldungen über zu langen Vektoren usw.Im Beispiel verwende ich
str_c()
. Ohnecollapse =
funktioniert diese Funktion wie erwartet, weil die Funktion speziell für die Verwendung inmutate
undsummarise
entwickelt wurde. Sie führt eine Vektor-Wert-Unterscheidung durch. Für die meisten Fälle funktioniert das ganz gut, aber leider nicht immer.Im Internet finden wir eine Menge Lösungen, die in solchen Fällen auf die
map()
-Funktionen derpurrr
-Bibliothek ausweichen. Das ist natürlich unschön. Eine andere Variante bietet dierowwise()
-Funktion von
dplyr
. Diese Funktion hat aber mehrere Probleme, so dass die Entwickler vondplyr
empfehlen, diese Funktion nicht mehr zu verwenden. Eines dieser Probleme ist die Bearbeitungsgeschwindigkeit und ein zweites ist die unflexible Handhabung imdplyr
-Programmiermodell.Ich habe mich gefragt, wie wir innerhalb des
dplyr
-Modells zeilenweise Transformationen erzwingen können, ohnemap
-Funktionen bemühen zu müssen. Die Lösung greift auf das Konzept der Iteratoren zurück. Dieses Konzept ist in der modernen Programmierung wichtig, um Iterationen umzusetzen. Eine Iteration ähnelt im Ergebnis einer Schleife - nur eben ohne eine Schleife mitfor
,while
oder ebenmap()/reduce()
. Stattdessen definieren wir einen Iterator, der die Schritte angibt und arbeiten diesen Iterator ab.Mit
dplyr
funktioniert das so:Diese Technik weist jedem Datensatz einen eindeutigen Wert zu. Dieser. Wert steht hier im Vektor
iterator
. Anschliessend wird die Stichprobe entlang dieses Vektors gruppiert. Weil der Vektor für jeden Datensatz einen eindeutigen Wert erzeugt hat, besteht jede Gruppe genau aus einem Datensatz. Die anschliessende Transformation mitmutate()
erhält damit jeweils immer nur Vektoren mit einem Element und nichtn()
-Elementen ohne die Gruppierung.Mit dieser Technik lassen sich auch verschachtelte Operationen mit mehreren Iteratoren realisieren. Dabei müssen wir beachten, dass der innerste Iterator immer genau einen Datensatz umfasst und wir nach aussen immer mehr Datensätze zusammenfassen. Für diese Technik verwenden wir ebenfalls Gruppierungen. Weil wir aber für äussere Iteratoren normalerweise Variablenbezogene Bedingungen verwenden, müssen wir keine zusätzlichen Iteratoren einführen, sondern können uns auf den Zeileniterator konzentrieren.
The text was updated successfully, but these errors were encountered: