Gabi und Sascha
Kategorien : Alle | Berlin | Bücher | Fotografie | Java | Linkhalde | Weichware | Verfassung

Ich arbeite mich gerade ein wenig in R ein, da ich Daten aus CSV Dateien statistisch aus­werten möchte. Dabei habe ich viel mit Datums­angaben zu tun. Im Folgenden ein paar Notizen die ich mir bisher gemacht habe

Datentyp in Spalte eines data.frame ändern

Beispiel: in einem data.frame existiert die Spalte Date. Beim Einlesen aus einer CSV Datei wird diese als kategorialer String erkannt.


    Date,Status,Solution
    2016-08-09T14:33:09,created,fixed
    2015-08-09T14:33:09,blocked,won't fix

Einlesen: df <- read.csv("date.csv", header=T)

Mittels des Kommandos


    df$Date <- as.Date(df$Date)

werden alle Werte umgewandelt.

Datetime umwandeln

Die R Klasse Date repräsentiert nur ein Datum. Für Datetime sind die beiden Klassen POSIXct und POSIXlt vorhanden. Beide halten Daten unter­schiedlich, liefern ansonsten allerdings ähnliche Funk­tionalität.

Umgewandelt wird wie folgt:


    df$Date <- as.POSIXct(strptime(df$Date, "%Y-%m-%dT%H:%M:%S"))

Als Defaultformat wird das ISO 8601 lang Format (mit Binde­strichen und Doppel­punkten) verwendet. Aller­dings mit dem Unter­schied, dass nicht der Standard­delimiter T verwendet wird, sondern ein Leer­zeichen. Beispiel: 2016-08-09 14:33:09. Aus diesem Grund kommt die Funktion strptime zum Einsatz, der das entsprechende Muster ("%Y-%m-%dT%H:%M:%S") mit T als Delimiter über­geben wird. Wird dies nicht in dieser Art und Wiese gemacht, wird nur das Datum ermittelt und die Zeit auf 00:00:00 gesetzt.

Jahr aus Date ermitteln


    df <- within(df, YEAR <- as.numeric(format(df$Date, "%Y")))

Fügt gleichzeitig eine neue Spalte (YEAR) in den data.frame ein. Dies liesse sich auch mittels df$YEAR <- as.numeric(format(df$Date, "%Y")) erledigen. Der Vorteil von transform ist, das mehrere Änderungen gleichzeitig durchgeführt werden können:


    df <- within(df, {YEAR <- as.numeric(format(df$Date, "%Y")),
                      MONTH <- as.numeric(format(df$Date, "%m"))
                     })

Wochentag (numerisch) mit Basis 1 für Montag berechnen


    df <- within(df, DOW <- ifelse((d = as.numeric(format(df$Date, "%w"))) == 0, 7, d))

Funktion holt aus einem Datum eines data.frames den Wochentag (as.numeric(format(df$Date, "%w"))) und weisst ihn einer Hilfsvariablen zu. Diese wird verglichen mit 0, da POSIX Date eine 0 für Sonntag zurück gibt. Ist der Wert 0 wird eine 7 zurück geliefert, ansonsten der Wert der Hilfsvariablen.

Kalenderwoche ermitteln

  • Mittels der Funktion format(Sys.Date(), "%V") kann die ISO 8601 Kalenderwoche ermittelt werden.
  • Mittels der Funktion format(Sys.Date(), "%U") kann die US Kalenderwoche ermittelt werden.

Ausgabe ist chr. Mittels as.numeric(…) in Zahl umwandeln.

Snippet um neue ISO WEEK Column in df ein zu fügen


    df <- within(df, WEEK <- as.numeric(format(df$Date, "%V")))

Subset aus data.frame

Ein Subset aus Zeilen eines data.frame, bei denen die Zellen einer Column einem Wert entsprechen. Zwei mögliche Lösungen:


    rows1 <- df[df$Status == "created", ]
    rows2 <- subset(df, Status == "created")

Vorteil der subset Funktion: Mittels des Parameters select können Spalten definiert werden, die in rows2 übernommen werden sollen:


    rows2 <- subset(df, Status == "created", select = c("Date", "Solution"))


Neben R verwende ich auch noch Bash Kommandos und sql4csv für die Bearbeitung von CSV Dateien. Für die Datenerhebung verwende ich unter anderen jan.