Tools in DataScience 3: data wrangling II
Hinweis:
- An jenen Stellen, die mit einem Graduation-Cap gekennzeichnet sind , erarbeiten Sie sich die Inhalte selbständig
- An Stellen mit einer Wandtafel warten Sie bitte auf Input seitens der Dozierenden
Worum geht es in dieser Sitzung:
Oft enthalten Datentabellen Datumsangaben, die je nach Quelle und “Autor” der Datendatei unterschiedlich formatiert sein können.
Auch in unserem Datenbeispiel gibt es Datumsangaben in den beiden Arbeitsdateien CafeDateInfo und CafeTransactionStore.
Anderseits gibt es eine sell_id und eine sell_category in den Datensätzen CafeTransactionStore und CafeSellMeta.
Wir wollen diese Datenblätter später miteinandern verbinden. Dies kann geordnet nach bestimmten Variablen und ungeordnet gemacht werden.
In unserem Beispiel verbinden wir die ersten beiden Datensätze mittels Datumsangabe und den cts und csm Datensatz mittels der sell_id. Den csm-Datansatz werden wir dafür vor dem verbinden noch verändern.
Wir beschäftigen uns in dieser Sitzung daher erst mit Datumsformaten, dann mit den Funktionen zum Verbinden von Datensätzen.
Am Ende der Sitzung streben wir ein finales Datenblatt bzw. einen Data Frame an, der alle relevanten Informationen der Teildatensätze zu unserem Datenbeispiel enthält.
Datumstypen und - formate in R
Installation des lubridate packages
Datumsangaben werden bei der Datenbe- und verarbeitung mit R sehr häufig genutzt. Entsprechend gibt es als Teil der tidyverse- package Sammlung ein eigenes package lubridate.
Mithilfe der Funktionen des *lubridate - package** in RStudio bearbeiten wir Datumsangaben.
Wir installieren das package und laden die Bibliothek.
install.packages('lubridate')
library(lubridate)
Weitere Informationen zum “lubridate - package” finden Sie unter:
https://lubridate.tidyverse.org/
Dort können Sie auch das entsprechende cheat sheet herunterladen: https://raw.githubusercontent.com/rstudio/cheatsheets/main/lubridate.pdf
Funktionen für die Be- und Verarbeitung von Datumsangaben
1. parser Funktionen: ymd(), ydm(), myd(), mdy(), dmy(), dym()
Mit den “parser Funktionen” kann man Strings in Datumsangaben des Standardformats (ISO 8601) “YYYY-MM-DD” überführen.
Ysteht dabei füryear,mfürmonthunddfürday. Die Reihenfolge der drei Datumsbestandteile entspricht jeweils der Vorgabe in der Funktion.Beispiel:
cts$calendar_date%>%head()## [1] 01/01/12 01/01/12 01/01/12 01/01/12 01/02/12 01/02/12 ## 1348 Levels: 01/01/12 01/01/13 01/01/14 01/01/15 01/02/12 01/02/13 ... 9/30/14class(cts$calendar_date)## [1] "factor"Speichern der String-“Datumsvariable” als reine Datumsvariable:
cts$calendar_date <- mdy(cts$calendar_date) cts$calendar_date%>%head()## [1] "2012-01-01" "2012-01-01" "2012-01-01" "2012-01-01" "2012-01-02" ## [6] "2012-01-02"class(cts$calendar_date)## [1] "Date"
2. Funktionen zum extrahieren von Datumsangaben und labels: year(), month(), day(), wday()
Mit den Funktionen zum extrahieren kann man das Jahr, den Monat oder den Tag eines Datumsobjektes extrahieren.
Zudem kann man sich bspw. die Wertelabel von Jahr, Monat oder Tag ausgeben lassen.
Beispiel:
Extrahieren von Tag, Monat und Jahr in je einer separaten Spalte im Data Frame:
data.frame(date = cts$calendar_date, day = day(cts$calendar_date), month = month(cts$calendar_date), year = year(cts$calendar_date)) %>% head()month(): Anzeige der Wertelabels vom Monat. Dabei wird Monat als Faktor gewertet (ohne Label als numeric):
month(cts$calendar_date, label = TRUE) %>% head()## [1] Jan Jan Jan Jan Jan Jan ## 12 Levels: Jan < Feb < Mar < Apr < May < Jun < Jul < Aug < Sep < ... < Decwday(): Anzeige der Wochentage (Montag, …), wobei der Wochentag als “Faktor” hinterlegt ist.
wday(cts$calendar_date, label = TRUE) %>% head()## [1] Sun Sun Sun Sun Mon Mon ## Levels: Sun < Mon < Tue < Wed < Thu < Fri < SatDies ist für beliebige Datumsangaben möglich.
## [1] Thu ## Levels: Sun < Mon < Tue < Wed < Thu < Fri < Sat
3. Funktionen zum extrahieren von Zeitangaben und zur Differenzbildung: Sys.time(), hour(), minute() und second(), hms() und Verbindungen von den Parser Funktionen bei 1. - bspw. “mdy_hms()”. Die Differenz zweier Daten kann u.a. durch interval() berechnet werden.
Mit den Funktionen zum Extrahieren von Zeitangaben kann man neben der Systemzeit (aktuell vor Ort oder in einer anderen Zeitzone), die Stunden, Minuten und Sekunden eines Zeitobjektes extrahieren.
Beispiele:
Systemzeit auf dem eigenen PC - also hier in der Schweiz:
now()## [1] "2026-04-24 17:00:32 CEST"Systemzeit - Greenwich Mean Time:
now("GMT+0")## [1] "2026-04-24 15:00:32 GMT"Systemzeit “Minute” und “Datum” auf dem eigenen PC:
now() %>% minute() now() %>% date()## [1] 0## [1] "2026-04-24"
Zu Berechnungszwecken kann man Zeit und Datumsobjekte umwandeln.
Beispiele:
Konvertierung eines Strings bzw. einer Zeichenkette in ein Periodenobjekt, d.h. die Zeichenkette “17:22:12” stellt nun nicht mehr den Zeitpunkt, sondern die Zeitdauer von 17 Stunden, 22 Minuten und 12 Sekunden dar. Es kann so für Berechnungen von bspw. Differenzen etc. verwendet werden.
x <- hms("17:22:12") x y <- hms("17:42:20") y-x## [1] "17H 22M 12S"## [1] "20M 8S"Konvertierung von Strings oder numerischen Werten mit Datums- und Zeitangabe in das Datums- und Zeitformat. Mit der Funktion mdy_hms() konvertieren wir eine Datumsangabe als DateTime-Objekt vom Typ “POSIXct”, d.h. Datum und die Uhrzeit werden als Anzahl der Sekunden seit dem 1. Januar 1970 gespeichert. Die Anzeige bleibt davon ausgenommen. Auch diese Objektklasse ist bei Berechnungen von Differenzen etc. nützlich.
x <- mdy_hms("Aug/14/1981 22:14:12") x class(x)## [1] "1981-08-14 22:14:12 UTC"## [1] "POSIXct" "POSIXt"Extrahieren von Teilaspekten der Zeit (oder Datums-)angabe aus Angaben mit Datums- und Zeitformat. Dabei können Funktionen wie bspw. year(), hour(), … verwendet werden. Zudem kann man eine Zeitzone (bspw. “UTC” (Universal Time Coordinated) - siehe “OlsonNames()” für alle Zeitzonen) festlegen.
x <- mdy_hms("Aug/14/1981 22:14:12", tz = "UTC") year(x) hour(x) second(x)## [1] 1981## [1] 22## [1] 12
Abschliessend können auch Differenzen zwischen Datums- oder Zeitangaben berechnet werden.
Beispiel:
Differenzen zwischen Datums und Zeitangaben kann man auf vielerlei Arten bilden (siehe cheat sheet)
Es gibt u.a. folgende Möglichkeiten:
x1<-mdy_hms("Jan/01/1970 00:00:12", tz = "Europe/Berlin") x2<-now() x3<-mdy_hms("Jan/01/1970 02:00:12", tz = "Europe/Berlin")Ausgabe der Differenz als double mit Klasse “difftime”
z <- x3-x1 typeof(z) class(z) z## [1] "double"## [1] "difftime"## Time difference of 2 hoursAusgabe der Differenz in Stunden
interval(x1, x3) %>% as.numeric('hours')## [1] 2Die Differenz aus reinen Zeitangaben (hier in Form von Perioden) erhält man u.a. durch folgende Syntax.
x <- hms("17:22:12") y <- hms("17:22:13") as.numeric(y - x, units = "seconds")## [1] 1
Übung I
Laden Sie nun das aktuelle R-Skript zur weiteren lokalen Bearbeitung der folgenden Übungsaufgaben herunter und speichern Sie es lokal in Ihrem Projektordner.
Lösen Sie die folgenden Übungsaufgaben und vervollständigen Sie das Skript Schrittweise nach jeder Übungsaufgabe.
Bei einigen der Multiple Choice Aufgaben ist es sicher hilfreich, wenn Sie die Syntax zur Lösungsfindung jeweils lokal bei sich in R ausprobieren.
Am Ende der Übung werden die Dozierenden mit Ihnen die Lösungen besprechen.
1
2
3
Überführen Sie die Variable “calendar_date” im df “cts” in eine Datumsvariable nach dem “Standardformat (ISO 8601) ‘YYYY-MM-DD’”. Überspeichern Sie die alte variable mit der neuen und prüfen Sie Ihr Vorgehen durch die Anzeige der Kopfzeile (head())
cts$calendar_date <- mdy(cts$calendar_date)
head(cts$calendar_date)
4
Nutzen Sie den %>% zusammen mit den Funktionen mutate(), filter() und nrow() um folgende Frage zu beantworten:
Wie viele Transaktionen haben im Mai (Monat 5) des Jahres 2014 stattgefunden?
Beachten Sie VORAB, dass die Variable “calendar_date” im Data Frame “cts” - wie in der vorhergehenden Aufgabe - erst in das passende Datumsformat gebracht werden muss, also ( (ISO 8601) “YYYY-MM-DD”).
#cts$calendar_date <-
#cts %>% mutate()
cts$calendar_date <- mdy(cts$calendar_date)
cts %>%
mutate(cts, monat = month(calendar_date), jahr = year(calendar_date)) %>%
filter(jahr==2014 & monat==5) %>%
nrow()
5
Nutzen Sie abermals den df “cts” mit angepasstem Datumsformat.
Fügen Sie zum df “cts” die Variable “weekday” hinzu, die die Wochentagsbezeichnung enthält (wday()) und eine Variable “mean”, die die Durchschnittsmenge verkaufter Güter pro Wochentag zusammenfasst.
Lassen Sie sich die beiden Variablen gemeinsam ausgeben, sodass die (auf 2 Nachkommastellen gerundete) mittlere Menge pro Wochentag ersichtlich wird. Nutzen Sie die dazu die Funktionen: mutate() %>% group_by() %>% summarize() in eben dieser Reihefolge.
#cts$calendar_date <- mdy(cts$calendar_date)
#cts %>% mutate()
cts$calendar_date <- mdy(cts$calendar_date)
cts %>% mutate(wochentag = wday(calendar_date, label = TRUE)) %>% group_by(wochentag) %>%
summarize(mean = round(mean(quantity),2)) %>% arrange(mean)
6
Laden Sie nun das aktualisierte R-Skript herunter und speichern Sie es lokal in Ihrem Projektordner.
Verbinden von Datentabellen I
Sie wissen bereits, wie man Datentabellen, in Form eines Data Frame, erstellt oder importiert und sie bearbeiten kann um an die für Sie relevanten Informationen zu gelangen. Sie wissen auch wie Sie Datentabellen umstrukturieren.
Wir besprechen nun die wichtigsten Möglichkeiten, die man zum Verbinden von Datentabellen braucht.
Installation des dplyr package
Mithilfe der Funktionen des dplyr-package in RStudio können wir Datentabellen verbinden.
Wir installieren das package und laden die Bibliothek.
install.packages('dplyr')
library(dplyr)
Weitere Informationen zum dplyr - package finden Sie unter: https://dplyr.tidyverse.org/
Dort können Sie auch das entsprechende cheat sheet herunterladen:
https://raw.githubusercontent.com/rstudio/cheatsheets/main/data-transformation.pdf
Funktionen für das Verbinden von Datentabellen
Beim Verbinden von Datentabellen hat man idealerweise 2 Tabellen zu denselben Objekten (Personen etc.) in derselben Reihenfolge vorliegen. In diesem Fall kann man den Objekten der Zieltabelle (Tabelle 1) also noch weitere Spalten aus zweiten Tabelle hinzufügen, indem man beide Tabelle einfach nebeneinanderstellt.
In der Praxis hat man jedoch in unterschiedlichen Tabellen nicht immer Informationen zu ausschliesslich gleichen Objekten vorliegen.
Wir besprechen nun anhand der Funktionen von join() verschiedene Fälle wie man Datentabellen, anhand bestimmter Spalten (Variablen) und in Abhängigkeit der Tabelle an die die andere(n) Tabellen hinzugefügt werden solle(n), zusammenfügen kann.
Ein Auszug aus unseren Beispieldaten:
Im folgenden Auszug unserer Beispieldaten enthält der 1. Data Frame csm (CafeSellMeta) die Variablen sell_id, sell_category, item_id und item_name.
Der Datensatz enthält alle 11 Originalzeilen. Er kann nur mit dem df1 über die sell_id und die sell_category verbunden werden.head(csm)Der 2. Data Frame “cts” (CafeTransactionStore) enthält u.a. die Variablen calendar_date, price, sell_id und sell_category. Mit der Funktion slice() werden die Zeilen 2:6 und 29 als Data Frame df1 abgespeichert.
cts <- read.table("CafeTransactionStore.csv", header = TRUE, sep = ",", stringsAsFactors = TRUE) cts$calendar_date <- mdy(cts$calendar_date) df1 <- cts %>% select(calendar_date, price, sell_id, sell_category) %>% slice(2:6,29)Der 3. Data Frame “cdi” (CafeDateInfo) enthält u.a. die Variablen calendar_date und average_temperature.
Die Zeilen 2:6 sind in df2 abgespeichert. Er unterscheidet sich im Datum zum Teil von df1.cdi <- read.table("CafeDateInfo.csv", header = TRUE, sep = ",", stringsAsFactors = TRUE) cdi$calendar_date <- mdy(cdi$calendar_date) df2 <- cdi %>% select(calendar_date, average_temperature) %>% slice(2:6)
Da Datensätze meist grösser sind als hier im Beispiel - man sie also nicht komplett überblicken kann -, kann man bspw. mit der Funktion identical() prüfen ob die Datensätze sich gleichen. In unserem Beispiel sind die beiden Datensätze df1 und df2 nach dem “calendar_date” geordnet, aber ungleich.
Beispiel:
Wir prüfen, ob die Datensätze df1 und df2 gleich sind.
identical(df1, df2)## [1] FALSE
1. left_join() - behält nur die Zeilen bzw. Objekte im Datensatz, die Informationen bei der/den Zuordnungsvariable(n) in der ersten Tabelle (zu der etwas hinzugefügt werden soll) enthalten.
Beispiel:
Wir wollen den df “csm” über die Variablen sell_id und sell_category zum df1 hinzufügen. Die Angabe der beiden Variablen beim Zusammenfügen ist in diesem Fall nicht zuwingend notwendig, da R automatisch die Variablen erkennt. Aus didaktischen Gründen ist es dennoch in die Befehlzeile integriert. Sollten Sie nur ausgewählte Variablen zum Verbinden verwenden wollen, müssen Sie diese explizit angegeben. Da die “sell_id” und die “sell_category” im DF “csm” mehrfach vorkommt (es gibt teilweise mehrere Zeilen, da es sich um Menüs handeln kann und diese aus mehreren Produkten bestehen), erhöht sich im folgenden Beispiel die Anzahl Zeilen im “df1” nach dem Verbinden.
left_join(df1, csm, by = c("sell_id", "sell_category"))Beispiel:
Wir wollen df2 über die Variable calendar_date zum df1 hinzufügen. Die “by” Option ist in unserem Beispiel nicht zwingend notwendig, da es nur diese eine, eineindeutige, Zuordnungsvariable in beiden Datensätzen gibt.
df1 df2 left_join(df1, df2, by = "calendar_date")
2. right_join() - behält nur die Zeilen bzw. Objekte im Datensatz, die Informationen bei der/den Zuordnungsvariable(n) in der zweiten Tabelle (zu der etwas hinzugefügt werden soll) enthalten.
Beispiel:
Wir wollen df1 über die Variable calendar_date zum df2 hinzufügen. Man kann auch mit dem %>% Operator arbeiten. Da am 02.01.2012 mehrere Einträge beim “df1” bestehen, wird df2 (da es den Datumseintrag dort ja auch gibt) beim Verbinden um eine Zeile erweitert.
df1 df2 df1 %>% right_join(df2, by = "calendar_date")
3. inner_join() - behält nur die Zeilen bzw. Objekte im Datensatz, die Informationen bei der/den Zuordnungsvariable(n) in beiden Tabellen enthalten.
Beispiel:
Wir wollen Informationen zu den Objekten aus df1 und df2 behalten, die in beiden Tabellen Einträge haben. Wir verbinden weiterhin über die Variable calendar_date. Wir müssen diese allerdings nicht zwingend aufführen, da es in beiden Datensätzen nur diese eineindeutige Zuordnungsvariable gibt.
df1 df2 inner_join(df1, df2)
4. full_join() - behält alle Zeilen bzw. Objekte aus beiden Tabellen, die bei der/den Zuordnungsvariable(n) Einträge haben.
Beispiel:
Wir wollen alle Einträge aus df1 und df2 behalten und verbinden über die Variable calendar_date.
df1 df2 full_join(df1, df2, by = "calendar_date")
5. semi_join() - behält alle Zeilen bzw. Objekte aus Tabelle 1, die bei der/den Zuordnungsvariable(n) in Tabelle 2 enthalten sind.
Beispiel:
Wir wollen df1 und df2 über die Variable calendar_date verbinden und nur die Zeilen bzw. Objekte aus Tabelle 1 behalten, die in Tabelle 2 enthalten sind.
df1 df2 semi_join(df1, df2, by = "calendar_date")
6. anti_join() - behält alle Zeilen bzw. Objekte aus Tabelle 1, über die wir bei der/den Zuordnungsvariable(n) keine Informationen in Tabelle 2 haben.
Beispiel:
Wir wollen df1 und df2 über die Variable calendar_date verbinden und nur die Zeilen bzw. Objekte aus Tabelle 1 behalten, die nicht in Tabelle 2 enthalten sind.
df1 df2 anti_join(df1, df2, by = "calendar_date")
Eine weitere Möglichkeit Datentabellen zusammenzufügen bzw. zu verbinden bietet R in Form der bind - Funktionen. In unseren Beispielen führt dies wieder zu neuen Data Frames, kann aber mitunter auch einen tibble produzieren.
Im Gegensatz zu den join - Funktionen versucht man damit nicht die Daten über eine bestimmte Variable, sondern generell zu verbinden - also unabhängig von der Reihenfolge der Zeilen bzw. Objekte in den Datensätzen.
Wenn die Dimensionen der Datensätze nicht zusammenpassen, erzeugen die bind-Funktionen eine Fehlermeldung.
Im Folgenden sehen Sie erneut den obigen Auszug aus unseren Beispieldaten:
Der 1. Data Frame “cts” (CafeTransactionStore) enthält u.a. die Variablen calendar_date und price. Mit der Funktion slice() werden die Zeilen 1:4 in df1 abgespeichert. Zusätzlich speichern wir die Zeile 5:8 in df2.
Der 2. Data Frame “cdi” (cafeDateInfo) enthält u.a. das calendar_date und average_temperature. Die Zeilen 10:13 sind in df3 gespeichert.
cts <- read.table("CafeTransactionStore.csv", header = TRUE, sep = ",", stringsAsFactors = TRUE) cts$calendar_date <- mdy(cts$calendar_date) df1 <- cts %>% select(calendar_date, price) %>% slice(1:4)df2 <- cts %>% select(calendar_date, price) %>% slice(5:8)df3 <- cdi %>% select(calendar_date, average_temperature) %>% slice(10:13)
1. bind_rows() - zum generellen zusammenfügen von Zeilen aus (unterschiedlichen) Datensätzen.
Beispiel:
Wir wollen df1 und df2 verbinden. Sie stammen aus demselben Datensatz und beinhalten dieselben Variablen (mit verschiedenen Einträgen). Wie unten ersichtlich, werden die Zeilen hinzugefügt. Dies geschieht auch bei identischen Einträgen in beiden Datensätzen.
df1 df2 bind_rows(df1, df2)Wir wollen df2 und df3 verbinden. Sie stammen aus 2 verschiedenen Datensätzen und produzieren somit einige leere Zellen (NA).
df2 df3 bind_rows(df2, df3)
2. bind_cols() - zum generellen zusammenfügen von Spalten aus (unterschiedlichen) Datensätzen.
Beispiel:
Wir wollen df1 und df3 verbinden. Wie unten ersichtlich, werden die Spalten hinzugefügt und bei identischen Namen neu benannt. Dies geschieht auch bei identischen völlig Einträgen in beiden Datensätzen.
df1 df3 bind_cols(df1, df3)
Übung II
Nutzen Sie Ihr lokales R-Skript “03_Datawrangling_1.R” und vervollständigen Sie es Schrittweise nach jeder Übungsaufgabe.
Bei einigen der Multiple Choice Aufgaben ist es sicher hilfreich, wenn Sie die Syntax zur Lösungsfindung jeweils lokal bei sich in R ausprobieren.
Sie müssen dafür die Daten, wie unten einleitend beschrieben, in R einlesen und die Datumsformatierung vornehmen.
Bei Fragen stehen Ihnen die Dozierenden zur Verfügung.
Am Ende der Übung werden die Dozierenden mit Ihnen die Lösungen besprechen.
Sie sehen unten einen weiteren Auszug aus unseren Beispieldaten:
Der 1. Data Frame “cts” enthält u.a. die Variablen calendar_date, price und quantity. Mit der Funktion slice() werden die Zeilen 4, 8, 12 und 16 als Data Frame df3 abgespeichert.
cts <- read.table("CafeTransactionStore.csv", header = TRUE, sep = ",", stringsAsFactors = TRUE) df3 <- cts %>% select(calendar_date, price, quantity) %>% slice(4,8,12,16)Der 2. Data Frame “cdi” enthält u.a. die Variablen calendar_date, is_weekend und is_schoolbreak. Mit der Funktion slice() werden die Zeilen 1, 3, 5, 7 und 9 als Data Frame df4 abgespeichert.
cdi <- read.table("CafeDateInfo.csv", header = TRUE, sep = ",", stringsAsFactors = TRUE) df4 <- cdi %>% select(calendar_date, is_weekend, is_schoolbreak) %>% slice(1,3,5,7,9)
1
Sie sehen folgenden Output:
2
3
Sie sehen folgenden Output:
4
Sie sehen folgenden Output:
> bind_cols(df3, df4) Error in `bind_cols()`: ! Can't recycle `..1` (size 4) to match `..2` (size 5). Run `rlang::last_error()` to see where the error occurred.
5
- Sie wollen einen Data Frame aus df3 und df4 erstellen, der die Spalten calendar_date, quantity und is_schoolbreak enthält und nur den 1.1 & 3.1.2012 enthält. Vervollständigen Sie die folgende Syntax:
df_neu <- df3 %>% _______ %>% select(calendar_date, quantity, is_schoolbreak)
6
- Sie wollen einen Data Frame aus df3 und df4 erstellen, der die Spalten calendar_date, quantity und is_schoolbreak enthält und alle Datumsangaben jeweils genau 1xmal enthält. Vervollständigen Sie die folgende Syntax:
df_neu <- df3 %>% _______ %>% select(calendar_date, quantity, is_schoolbreak)
Verbinden unserer Beispieldatensätze
Verbinden Sie nun die Beispieldaten cts (CafeTransactionStore) und cdi (CafeDateInfo) zu einem Datensatz, damit Sie diesen Gesamtdatensatz weiter bearbeiten können.
Ändern (und überspeichern) Sie dafür in den Data Frames die Spalte “calendar_date” als Datumsvariable.
Eine mögliche Problemstellung beim Umgang mit verschiedenen Datensätzen
Da wir vom Shopbetreiber wissen, dass es in den beiden Datenfiles nur Einträge für jeweils dieselben Tage gibt, sollten es gleich viele unique values sein. Sie können die Anzahl der “unique values” in beiden Data Frames mit der Funktion n_distinct() auszählen. Sie sind gleich.
Demnach muss aber im Data Frame “cdi” ein Tag doppelt erfasst worden sein (es gibt 1348 unique values, aber 1349 Einträge im cdi).
Wir finden diesen Tag bzw. Eintrag, indem wir bei der Variable zum Verbinden der Datensätze, calendar_date, die Häufigkeiten der Ausprägungen zählen.
1
Finden Sie den doppelten Eintrag in der Spalte “calendar_date” im df “cdi”, indem Sie die Funktionen which.max() und table() auf die Spalte im df anwenden.
Welche Kalendereinträge sind mehrfach? Nutzen Sie die Funktionen which.max() und table().
Warum sind Sie mehrfach (filter())? Gibt es andere Spalten, die sich zwischen den Datumseinträgen unterscheiden?
#Vorarbeiten:
cts <- cts %>%
mutate(calendar_date = mdy(calendar_date))
class(cts$calendar_date)
n_distinct(cts$calendar_date)
#Anzahl unique values
cdi <- cdi %>%
mutate(calendar_date = mdy(calendar_date))
class(cdi$calendar_date)
n_distinct(cdi$calendar_date)
#Anzahl Zeilen sollte gleich sein, da jeder Tag nur einmal vorkommen kann
#Dem ist aber nicht so, wie sich zeigt:
nrow(cdi)
# Vorarbeiten
# cts <- cts %>%
# mutate(calendar_date = mdy(calendar_date))
# class(cts$calendar_date)
# n_distinct(cts$calendar_date)
# cdi <- cdi %>%
# mutate(calendar_date = mdy(calendar_date))
# class(cdi$calendar_date)
# n_distinct(cdi$calendar_date)
#Sind alle Werte bei calendar_date nur einmal vorhanden oder gibt es Mehrfacheinträge?
max(table(cdi$calendar_date))
#Welche Kalendereinträge sind mehrfach? Nutzen Sie die Funktionen which.max() und table().
cdi$calendar_date[which.max(table(cdi$calendar_date))]
#Warum, bzw. bei welcher Spalte, gibt es doppelte Einträge?
cdi %>%
filter(calendar_date == "2013-03-01")
2
Ersetzen Sie bei den Mehrfacheinträgen die Werte bei “average_temperature” durch den Mittelwert aller Mehrfacheinträge.
Überprüfen Sie, ob es funktioniert hat.
#Vorarbeiten:
cts <- cts %>%
mutate(calendar_date = mdy(calendar_date))
cdi <- cdi %>%
mutate(calendar_date = mdy(calendar_date))
#cdi$average_temperature[cdi$calendar_date == ] <- cdi %>%
#Vorarbeiten:
#cts <- cts %>%
#mutate(calendar_date = mdy(calendar_date))
#cdi <- cdi %>%
#mutate(calendar_date = mdy(calendar_date))
#Ersetzen des ungleichen Temperatureintrages bei bei den Zeilen durch deren Mittelwert
cdi$average_temperature[cdi$calendar_date == "2013-03-01"] <-
mean(cdi$average_temperature[cdi$calendar_date == "2013-03-01"])
#Inspizieren, ob es funktioniert hat.
cdi %>%
filter(calendar_date == "2013-03-01")
3
Löschen Sie abschliessend die Mehrfacheinträge aus den Daten und speichern Sie Ihr Ergebnis im df “cdi_1”.
“cdi_1” sollte nun 1348 Einträge haben.
Nutzen Sie die Funktion distinct().
#Vorarbeiten:
cts <- cts %>%
mutate(calendar_date = mdy(calendar_date))
cdi <- cdi %>%
mutate(calendar_date = mdy(calendar_date))
#Ersetzen des ungleichen Temperatureintrages bei bei den Zeilen durch deren Mittelwert
cdi$average_temperature[cdi$calendar_date == "2013-03-01"] <-
mean(cdi$average_temperature[cdi$calendar_date == "2013-03-01"])
# löschen einer der identischen Zeilen mit der Funktion distinct()
cdi <- cdi %>%
distinct()
str(cdi)
4
Verbinden Sie nun die beiden Datensätze über die Spalte “calendar_date”.
Der Datensatz “cdi” sollte dabei zum Datensatz “cts” mit der passendenn “join”- Funktion hinzugefügt werden.
Prüfen sie danach mit str(), ob es funktioniert hat. Der df_work sollte 5404 Zeilen und 11 Spalten haben.
#Vorarbeiten:
cts <- cts %>%
mutate(calendar_date = mdy(calendar_date))
cdi <- cdi %>%
mutate(calendar_date = mdy(calendar_date))
#Ersetzen des ungleichen Temperatureintrages bei bei den Zeilen durch deren Mittelwert
cdi$average_temperature[cdi$calendar_date == "2013-03-01"] <-
mean(cdi$average_temperature[cdi$calendar_date == "2013-03-01"])
# löschen einer der identischen Zeilen mit der Funktion distinct()
cdi <- cdi %>%
distinct()
df_work <- cts %>% left_join(cdi, by = "calendar_date")
str(df_work)
Abschliessend: Vorbereitung der “csm-Daten” zum Verbinden.
I. Inspizieren des csm-Data Frame.
Schauen wir uns den Data Frame “csm” vor dem Verbinden einmal genauer an. Er enthält manche sell_ids mehrfach, was beim verbinden zu Problemen führen wird. Die sell_id müsste eineindeutig vorliegen. Wir wollen deshalb aus dem Ursprungsdatensatz einen übersichtlicheren Datensatz bilden.
csm
II. Verändern der csm-Daten, sodass uns zusammengefasste (aggregierte) Daten pro sell_id mit neuen Variablen für die verkauften Produkte vorliegen.
Wir wollen aus dem Ursprungsdatensatz einen übersichtlicheren Datensatz bilden. Dies geschieht mittels der Funktion dummy_cols(), die für jede Ausprägung der Variable “item_name” eine neue Spalte erstellt. [“dummy_cols()” ist im package “fastDummys” beinhaltet]. Diese beinhaltet die 1, wenn der “item_name” bei der entsprechenden “id_sell” als Produkt enthalten ist. Danach löschen wir die unnötigen Variablen (item_name, sell_category und item_id) und summieren pro “sell_id” über alle Zeilen. Abschliessend benennen wir die neuen Zeilen um.
csm1 <- dummy_cols(csm, select_columns = c("item_name")) %>% subset(select = -c(item_name, sell_category, item_id)) %>% aggregate(by = list(csm$sell_id),FUN = sum) colnames(csm1) <- c('sell_id','sell_id_new','burger','coffee','coke','lemonade') csm1
Laden Sie nun das aktualisierte R-Skript herunter und speichern Sie es lokal in Ihrem Projektordner.
Was haben wir gelernt:
Wir können mit dem package lubridate verschiedene Datumsformate in das Standardformat (ISO 8601) “YYYY-MM-DD” umwandeln und auch Teilinformationen aus Datumsangaben extrahieren.
Wir können Zeitangaben bearbeiten.
Wir können Datentabellen in Form eines Data Frame mit den Funktionen des package dplyr entweder generell oder anhand bestimmter Variablen verbinden bzw. zusammenführen.
Hausaufgabe
Bearbeiten Sie die folgende Aufgabenstellung im Skript “03_Datawrangling_2”.
Verbinden Sie den Data Frame “df_work” nun final mit dem Data Frame “csm1” über die Variable “sell_id”.
Der Data Frame “df_work” sollte danach 5404 Zeilen und 16 Spalten enthalten.