R-Tipps: Dplyr in Funktionen nutzen
Seit es das R-Package dplyr gibt, sind viele Aufgaben bei der Datenbearbeitung einfacher geworden. Soll dieselbe Umformung für viele Variablen durchgeführt werden, kann es eine Menge Tipparbeit sparen, wenn man den Code in eine Funktion packt.
Bei der Arbeit mit dplyr ist es wichtig, dass man plyr – sofern man es benötigt – grundsätzlich als erstes lädt. Andernfalls treten Fehlermeldungen auf. summarise() gibt es beispielsweise in plyr, aber auch in dplyr, was zu Konflikten führt: „Error in n() : This function should not be called directly”.
# Installieren der nötigen Pakete
install.packages("plyr")
install.packages("dplyr")
install.packages("tidyr")
install.packages("lazyeval") #oder: devtools::install_github("hadley/lazyeval")
library("plyr")
library("dplyr")
library("tidyR")
library("lazyeval")Was macht dplyr so besonders? Dplyr-Code ist einfach lesbar, logisch und arbeitet sequenziell, da es den Pipe-Operator %>% aus dem MagrittR-Package nutzt. Durch „%>%“ (sprich: then) können Manipulationen in einer intuitiven Reihenfolge ausgeführt werden.
Ein einfaches Beispiel: alle Personen eines Datensatzes nach den Kategorien einer Variable gruppieren und die Anzahl je Kategorie bestimmen.
Beispiel<-dataframe %>%
group_by(variable) %>%
summarise(
freq = n()
)dplyr in Funktionen Versucht man den obigen dplyr-Code in eine Funktion zu schreiben, stößt man auf eine Fehlermeldung. Innerhalb von Funktionen muss eine andere Version der dplyr-Funktionen verwendet werden: Standard evaluation (SE).
- Anstatt summarise() ⇒ summarise_()
- Anstatt mutate() ⇒ mutate_()
- Anstatt filter() ⇒ filter_()
- usw.
Zusätzlich ist die Übergabe der Input-Objekte leicht unterschiedlich. Entweder als Formel „~ Objekt”, als „quote(Objekt)” oder als String „‘Objekt’“. Hadley Wickham empfiehlt die erste Möglichkeit.
test.function <- function(dataframe, variable){
dataframe %>%
group_by_(variable) %>%
summarise_(
freq = ~n()
)
}
#Aufrufen der Funktion für den test_dataframe und die Variable gender
test<-test.function(test_dataframe, ~gender)Komplexeres Beispiel Der folgende Code führt eine Gewichtung durch, bildet Anteilswerte der Antworten und generiert einen Plot.
#Funktion zur Berechnung der gewichteten Anteilswerte
weighting.function <- function(dataframe, variable){
dataframe %>%
group_by_(variable) %>%
summarise_(
freq = ~n(),
freq_weighted = ~sum(weight)
) %>%
mutate_(
perc=~freq/sum(freq)*100,
perc_weighted=~freq_weighted/sum(freq_weighted)*100
) %>%
gather(key=Gewichtung,value=Wert,perc:perc_weighted)
}
#Ausführen der Funktion
gender_w<-weighting.function(datensatz, ~gender)
# Plotten der Daten mit ggplot2
library("ggplot2")
ggplot(gender_w) + geom_bar(aes(x=gender,y=Wert), stat="identity") + facet_grid(~Gewichtung) +
scale_x_discrete(labels=c("männlich","weiblich","NA"))+
ggtitle("Anteilswerte Geschlecht - gewichtet und ungewichtet")
Weitere Informationen zu standard evaluation in dplyr (vignette „tidy-data”).