Link
Als Agnostiker ist Deutschland für mich trotz allem ein christlich geprägtes Land. Und aus dieser Sicht betrachte ich den ansteigenden Zuspruch zu Populisten.
Die christliche Lehre kennt das Paradies und die Hölle mit der ewigen Bestrafung - das Jüngste Gericht lasse ich aussen vor. Die Menschen streben nach dem Paradies, auch wenn es in letzter Konsequenz vermutlich der langweiligste Ort überhaupt ist.
Menschen brauchen die Hoffnung auf das Paradies. Sie brauchen die Hoffnung, dass es ihnen später besser geht. Ich denke, dass viele Wähler der Populisten diese Hoffnung nicht mehr haben. Sie haben Angst vor Altersarmut. Sie haben Angst vor dem Damoklesschwert des Abstiegs, vor Hartz Ⅳ und sozialer Ächtung.
Parteien, die nur darüber diskutieren wann die nächste negative Anpassung der Rentenformel erfolgt können nicht erwarten, dass die Wähler sie in Scharen wählen. Parteien, die die soziale Spaltung vorantreiben und das Bildungssystem kaputt sparen und Infrastrukturen verramschen wollen können nicht erwarten, dass die Bürger sie mögen und wählen. Parteien, die Arbeitslose und Hartz Ⅳ-Empfänger in die Schmarotzerecke stellen können nicht erwarten, dass ihnen bei dieser Angst die Stimmen der Bürger zufliegen.
Parteien mit einem negativen Menschenbild, die die permanente Bestrafung der Bürger vorantreiben schaffen keine Hoffnung auf das Paradies.
Populisten und Nazis wie die AfD bedienen die urchristliche Sehnsucht nach dem Paradies. Dabei wird das rückwertsgewandte menschenverachtend negative Grundkonzept einer AfD ausgeblendet. Die Hoffnung überstrahlt alles.
Es fehlt ein positives, zukunftsorientiertes Menschenbild, das dem Bürger die Hoffnung auf eine bessere Zukunft gibt.
3 notes
·
View notes
Link
Mein aktueller Einstieg in ein R-Script. Es wird unterschieden ob das Script als Entwicklungsscript aus RStudio gestartet wird oder von der Kommandozeile. Je nachdem werden Kommandozeilenparameter unterschiedlich gesetzt oder interpretiert.
#!/usr/local/bin/Rscript args # Checks whether the script was executed from within RStudio or not. # In case of RStudio getwd() returns the working directory of the script. script.path
3 notes
·
View notes
Photo

Schmetterling auf Blatt
5 notes
·
View notes
Photo

Atlasspinner
0 notes
Link
Ich muss ermitteln wie breit die Abstände vom Inhalt eines Bildes zum Rand sind. Eines ziemlich einfachen Bildes. Dies allerdings nicht für 1 Bild sondern für ein paar tausend Bilder. Bei solchen Aufgaben helfen Photoshop und Gimp nur bedingt weiter. Aber zum Glück gibt es das Schweizer Taschenmesser für Grafikbearbeitung: imagemagick.
Die Bilder sehen alle ungefähr wie das Folgende aus:
640 % 400
Allerdings habe ich bei imagemagick auch keine Bordmittel gefunden wie die Rahmenbreite ermittelt werden kann. Deswegen musste ich einen Umweg gehen.
Zuerst wird das Bild so zugeschnitten, dass nur der innere Bereich erhaten bleibt. Mittels des -trim Kommandos kann der Rahmen weggeschnitten werden. Dabei schneidet imagemagick alles weg was nicht den Farben der 4 Eckpunkten entspricht.
convert "two black elipses.png" -trim "two black elipses (trimmed).png"
Das Ergebnis sieht so aus:
299 x 177
Mit dem Wissen um den -trim Befehl kann jetzt die Breite des linken Randes bestimmt werden. Damit der rechte Rand nicht ebenfalls weggeschnitten wird, wird in das Originalbild genommen und dort ein schwarzer Strich gezeichnet, gefolgt von einem weiteren weissen Strich. Das neue Bild wird unter einem eigenen Namen abgelegt:
convert "two black elipses.png" \ -gravity East \ -background black \ -splice 5x0 \ -background white \ -splice 5x0 \ "two black elipses (helper).png" convert "two black elipses (helper).png" \ -trim "two black elipses (helper, trimmed).png"
Von dem trimmed Bild muss jetzt die Breite ermittelt werden. Für spätere Berechnungen wird der Wert gleich in einer Variablen gespeichert:
W=$(convert "two black elipses (helper, trimmed).png" -format "%w" info: )
Um die Breite des linken Rahmens zu berechnen, muss noch die Breite des Originalbildes ermittelt werden. Auch dieser Wert wird gleich in einer Variable gespeichert. Ebenfalls benötigt wird noch die Breite des trimmed original Bildes.
TOTAL_WIDTH=$(convert "two black elipses.png" -format "%w" info: ) TRIMMED_WIDTH=$(convert "two black elipses (trimmed).png" -format "%w" info: )
Mittels Subtraktion kann jetzt die jeweilige Rahmenbreite Links und Rechts berechnet werden:
BORDER_LEFT_WIDTH=$(expr ${TOTAL_WIDTH) - 2 - ${W}) BORDER_RIGHT_WIDTH=$(expr ${TOTAL_WIDTH} - ${BORDER_RIGHT_WIDTH} - ${TRIMMED_WIDTH})
Die Berechnung der oberen und unteren Rahmenhöhe ist ensprechend:
TRIMMED_HEIGHT=$(convert "two black elipses (trimmed).png" -format "%h" info: ) convert "two black elipses.png" \ -gravity South \ -background black \ -splice 0x5 \ -background white \ -splice 0x5 \ "two black elipses (helper).png" convert "two black elipses (helper).png" \ -trim "two black elipses (helper, trimmed).png" H=$(convert "two black elipses (helper, trimmed).png" -format "%h" info: ) TOTAL_HEIGHT=$(convert "two black elipses.png" -format "%h" info: ) BORDER_TOP_HEIGHT=$(expr ${TOTAL_HEIGHT} - 2 - ${H}) BORDER_BOTTOM_HEIGHT=$(expr ${TOTAL_HEIGHT} - ${BORDER_TOP_HEIGHT} - ${TRIMMED_HEIGHT})
Ergebnis:
border top height 119 border bottom height 104 border left width 167 border right width 174
Download Bash Script der kompletten Umsetzung.
0 notes
Link
Habe heute einen kurzen R Benchmark gemacht, bei der ein data.frame mit 7,7 Millionen erweitert wird. Dabei habe ich einmal den eingebauten within verwendet und ein anderes mal die Funktion dplyr::mutate.
Der within Code:
logdata <- within(logdata, { YEAR <- as.numeric(format(logdata$timestamp, "%Y")) MONTH <- as.numeric(format(logdata$timestamp, "%m")) WEEK <- as.numeric(format(logdata$timestamp, "%V")) DOM <- as.numeric(format(logdata$timestamp, "%d")) DOW <- ifelse((DOW = as.numeric(format(logdata$timestamp, "%w"))) == 0, 7, DOW) HOUR <- as.numeric(format(logdata$timestamp, "%H"))})
Der dplyr::mutate Code:
logdata <- logdata %>% mutate( YEAR = as.numeric(format(timestamp, "%Y")), MONTH = as.numeric(format(timestamp, "%m")), WEEK = as.numeric(format(timestamp, "%V")), DOM = as.numeric(format(timestamp, "%d")), DOW = ifelse((DOW = as.numeric(format(timestamp, "%w"))) == 0, 7, DOW), HOUR = as.numeric(format(timestamp, "%H")))
Durchschnittliches Laufzeitverhalten nach jeweils 10 Durchgängen:
mutate: 36s within: 31s
Bleibe bei dieser Umwandlung erst einmal bei within.
Hardware: MacBook Pro (Retina 13 Zoll, Anfang 2015); 3,1 GHz Intel Core i7; 16 GB 1867 MHz DDR3 OS: macOS 10.11.6 R: version 3.3.1 (2016-06-21) -- "Bug in Your Hair" dplyr: version 0.5.0
0 notes
Link
Leerverkäufe, die; verkaufe etwas das du nicht hast. Gibt es zum Beispiel im Aktien- und Derivatenhandel. Damit wird auf fallende Kurse gewettet. Du verkaufst teuer Aktien oder Optionen die du nicht hast in Erwartung, dass die Preise gefallen sind, wenn du liefern musst - und erst dann kaufst.
Auch im Versandhandel kann es zu Leerverkäufen kommen. Das hat allerdings weniger mit Gewinnstreben zu tun als mehr mit schlechter Datensynchonisierung, ist also ein IT Problem. Leerverkäufe kommen vor wenn der Onlineshop nicht weiss wieviel Artikel einer Art im Warenwirtschaftssystem sind. Der Shop verkauft dann Dinge die es im Lager nicht mehr gibt. Der Händler muss dann üblicherweise die Hosen runter lassen. Entweder in dem er dem Kunden eine Mail schickt und die Situation erklärt und bedauert. Dann kann der Händler Glück haben, dass der Kunde Verständnis hat; oder er kann Pech haben, weil er einen verärgerten Kunden verliert. Oder man kann es ganz anders machen. So wie der Versandhandel Boden, der seine Kunden nicht ernst nimmt und nicht will dass sie wieder kommen.
Was war passiert? Frau hat etwas bei Boden bestellt, für das Kind. Zwei Teile. Keine grosse Sache. Bezahlen per Rechnung. Wenige Minuten nach der Bestellung kam die Bestellbestätigung. Am nächsten Tag dann die nächste sogenannte Transaktionsmail: ihre Bestellung wurde versendet. Und etwas später dann noch: das Packet kommt bald an. Es ist auch angekommen und das Kind hat sich gefreut. Aber dann, oh Schreck, die Entäuschung. Es kam nur die Hälfte der Bestellung an. In dem Briefumschlag - neben einem der Artikel - ein Formschreiben. Man bedauere nicht alles bestellte haben liefern können, aber der eine Artikel sei leider vergriffen. Dafür müssen der auf der Rechnung aufgeführte Artikel - mit einem Sternchen gekennzeichnet - auch nicht bezahlt werden. Den Differenzbetrag bitte selber ausrechnen.
Der Versandhandel Boden wusste also schon zum Zeitpunkt der Versandmail, dass nicht alles geliefert werden kann - und verliert darüber kein Wort in den beiden Mails. Vielmehr hält er mit den Mails die Erwartungshaltung hoch. Sorry, aber das geht so nicht.
Die Bestellung ist heute wieder zurück gegangen. Und es wird auch keine weiteren Lieferungen vom Boden Versand an uns geben.
0 notes
Link
Ich habe eine CSV Datei mit Log Informationen. Die Log Information können durch ein Timestamp geordnet werden. Für dir Auswertung benötige ich allerdings nur Log Informationen vollständiger Wochen (Montag → Sonntag). In der Datei befinden sich auch nicht vollständige Wochen.
Hier nun ein Lösungsweg in R nur die vollständigen Wochen zu ermitteln:
Hinweis: Die CSV Datei wurde in die data.frame Variable log eingelesen. Die Spalte mit dem Zeitstempel heisst timestamp.
# Umwandeln des ISO 8601 Datums. log$timestamp <- as.POSIXct(strptime(log$timestamp, "%Y-%m-%dT%H:%M:%S")) # Hilfsfelder einfügen. log <- within(log, {YEAR <- as.numeric(format(log$timestamp, "%Y")) MONTH <- as.numeric(format(log$timestamp, "%m")) WEEK <- as.numeric(format(log$timestamp, "%V")) DOW <- ifelse((DOW = as.numeric(format(log$timestamp, "%w"))) == 0, 7, DOW) }) # Ziel data.frame. fullweeks <- data.frame() # Durchlaufen der eindeutigen Wochen. for (week in unique(log$WEEK)) { # Ermitteln der eindeutigen Wochentage der eindeutigen Wochen. days <- unique(log$DOW[log$WEEK == week]) # Enthält Vektor eindeutigen Eintrag für jeden Wochentag? if (length(days) == 7) { fullweeks <- rbind(fullweeks, log[log$WEEK == week,]) } }
fullweeks enthält nun nur Logeinträge voller Wochen.
0 notes
Link
Angenommen ich habe ein R data.frame DF mit den Spalten A, B und C. Ich möchte nun alle Zeilen aus DF deren Spalte B den Wert "Closed" hat und in Kombination mit Zeile A doppelt vorkommt.
Mein Lösungsweg:
Ein data.frame erzeugen, der nur die Spalten A und B enthält: sl <- data.frame(A = DF$A, B = DF$B)
Filtern nach Zeilen, die nur B == "Closed" entsprechen: slc <- sl[which(sl$B == 'Closed'),]
Im letzten Schritt die doppelten Zeilen ermitteln: slcd <- slc[duplicated(slc),]
0 notes
Link
Noch so ein R Problem gelöst. Wieder mit dem plyr API.
Ich habe ein data.frame mit den Spalten für Jahr, Monat und Laufzeit. Für jede Jahr-Monats Kombination gibt es eine unterschiedliche Anzahl von Laufzeitwerten. Die Laufzeit der Jahr-Monatskombination möchte ich nun in einem Reihenboxplot visualisiert darstellen.
year month duration 2016 6 345 2016 6 378 2016 6 501 2016 6 390 2016 6 333 2016 6 321 2016 5 401 2016 5 378 2016 5 390 2016 5 331 2016 5 345
Für den Boxplot muss ich die Daten allerdings anders organisiert haben. Die Daten für die Laufzeitwerte eines Monats müssen in jeweils einem Vector innerhalb einer Spalte gespeichert werden.
5 6 401 345 378 378 390 501 331 390 345 333 NA 321
Um dies zu erreichen erzeuge ich zuerst eine leere Liste:
li <- list()
Im Anschluss durchlaufe ich die Ursprungsliste in einer Schleife und weise die jeweiligen Laufzeitwerte der neuen Liste l zu:
for (i in 5:6) { li[[i-4]] <- with(dur, dur$duration[dur$month == i]) }
Die so erzeugte Liste aus Vektoren wandel ich jetzt in einen data.frame um:
dur.df <- ldply(li, rbind)
Das Ergebnis sieht jetzt so aus:
1 2 3 4 5 6 401 378 390 331 345 NA 345 378 501 390 333 321
MIttels des transpose Befehls t(…) kann die Matrix so angepasst werden, dass aus den Zeilen Spalten werden:
dur.dft <- t(dur.df)
Damit kann jetzt der Boxplot mittels boxplot(dur.dft)erzeugt werden:
Unsicherheit
Da for Schleifen in R eher selten sind bleibt die Unsicherheit, ob die Lösung die eleganteste ist. Fürs erste allerdings reicht es.
CSV Datei und Code zum selber ausprobieren.
0 notes
Link
Ich habe ein kleines Programm geschrieben, um CSV Dateien mit SQL Befehlen von der Kommenadozeile ad-hoc zu untersuchen: sql4csv. Ziel war es ein Query wie das folgende von der Bash Kommandozeile ab zu setzen:
> scq select distinct author from books.csv
Das Ergebnis wird dann wieder in Form einer CSV Datei ausgegeben:
author Douglas Adams Terry Pratchet
Bei der Entwicklung habe ich Wert auf einfache Verwendung gelegt. So soll es nicht nötig sein die Werttypen (integer, numeric oder Datumsangaben) der Spalten vor der Benutzung. Vielmehr soll dies das Tools möglichst selbst erkennen und die Spaltentypen entsprechend anpassen. Damit sollen auch Abfragen wie
> scq select ABC from xyz.csv where VALUE
möglich sind.
Für integer und numeric typen ist das auch ohne grosse Probleme möglich. Kniffelig ist es bei Datums- und Zeitabgaben. Hier gibt es zig unterschiedliche Formate. Deswegen habe ich mich für einen pragmatischen Weg der Umsetzung entschieden: es werden aktuell die drei für mich wichtigsten Datumsformate für den Gregorianischen Kalender unterstützt
Datums- und Zeitformate
Y - steht für das Jahr. Jahre werden immer vierstellig angegeben
M - steht für den Monat
D - steht für den Tag im Monat
h - steht für Stunden
m - steht für Minuten
s - steht für Sekunden
Datumsangaben
YYYY-MM-TT
ISO 8601 ähnlich.
Unterstützt wird auch eine sogenannte lazy Schreibweise, bei der auf einen führende Null (0) bei Zahlen unter 10 verzichtet werden kann. Dies bedeutet, dass auch ein Datum 2016-9-6 als 6. September 2016 erkannt wird.
MM/DD/YYYY
Amerikanische Datumsschreibweise.
Wie bei der ISO 8601 Schreibweise wird auch hier eine lazy Schreibweise ohne führende Null unterstützt.
DD.MM.YYYY
Entspricht der numerischen DIN 5008.
Wie bei der ISO 8601 Schreibweise wird auch hier eine lazy Schreibweise ohne führende Null unterstützt.
Zeitangaben
Zeiten werden immer mit einem Doppelpunkt getrennt. Dabei unterstützt sql4csv nur die Reihenfolge hh:mm:ss. Dieses Format allerdings auch lazy, also ohne führende Null und die Sekunde kann ebenfalls weggelassen werden. In diesem Fall wird die Sekunde intern auf Null gesetzt..
Zeitstempel
Zeitstempel sind eine Kombination aus Datum und Zeit. sql4csv erlaubt alle Kombinationen von Datums- und Zeitangaben. Dabei kann als Separator das ISO 8601 T verwendet werden oder ein Leerzeichen.
Beispiele
2016-7-3 1:16
8/30/1969T23:5:07
11.11.2011 11:11:11
Implementierung
sql4csv wurde in Java 8 implementiert. Ich habe es auch geschrieben, um die neuen Sprachfeatures von Java 8 in der Praxis zu lernen und anzuwenden. So kommen intensiv Lambdas zum Einsatz und auch Methodenreferenzen. Die gesamte Datums- und Zeitbearbeitung basiert auf dem java.time API.
Als Datenbank verwende ich Derby als in-memory Datenbank. Ich verwende nicht SQLite - wie dies einige andere Implementierungen für ein solches Tool tun - da dies entweder eine vorhandene Installation von SQLite voraussetzt oder ich die Binaries für die unterschiedlichsten Plattformen mitliefern müsste. Das ist zu kompliziert und wird der Einfachheit des Werkzeuges nicht gerecht.
Probleme
SQL Queries und die Bash als Kommandozeileninterpreter vertragen sich nur mässig miteinander. Beispielsweise interpretiert die Bash das Asterisk Zeichen (*) anders als in SQL vorgesehen. Und diese Interpretation kann auch nicht einfach ausgeschaltet werden. Ein Query wie
> scq select * from books.csv where author = 'Douglas Adams '
ist nicht möglich. Die Bash ersetzt das * Zeichen durch die Dateinamen des aktuellen Verzeichnisses. Als Abhilfe kann das Hilfstool scq-cols verwendet werden:
> scq select $(scq-cols books.csv) from books.csv where author = 'Douglas Adams'
Das ist nicht schön, aber eine pragmatische Lösung. Nach einigen malen benutzen hatte ich mich daran gewöhnt.
Ebenso müssen runde Klammern (z.B. für Gruppierungen) und spitze Klammern <> für grösser und kleiner Vergleiche durch eine Backslash (\) maskiert werden. Insgesamt kann durch diese Einschränkungen die Lesbarkeit des Queries beeinträchtigt werden.
Download und Installation
Im sql4csv Repository auf Github findet ihr eine Download und Installationsanleitung, um das Tools selbst einmal ausprobieren zu können.
0 notes
Link
Mit meinem kleinen R Projekt geht es weiter. Ich hatte die folgende Situation: Ich habe die Zeitpunkte mehrere Statusübergänge eines Issues in einer denormalisierten Tabelle. Dabei kommt der Status created pro Issue exakt einmal vor. Zusätzlich habe ich noch die Dauer, die ein Issue in dem jeweiligen Status war. Ich will nun die Dauer und den created Zeitpunkt behalten. Alle anderen Zeitpunkte und auch sämtliche Status benötige ich im weiteren Verlauf nicht mehr.
Die Ausgangstabelle X sieht ungefähr so aus:
IssueID Date Status Duration A 2016-08-09T14:33:09 created 0 A 2016-08-19T09:21:11 open 845282 A 2016-08-19T16:01:53 closed 24042 A 2016-08-21T16:06:12 open 172800 A 2016-08-25T08:13:45 closed 345600 B 2015-09-23T12:22:21 created 0 B 2015-09-25T07:11:01 open 172800 B 2015-10-01T14:05:28 closed 518400
Ziel ist eine Tabelle, in der Duration der einzelnen Issues aufsummiert sind und das Date von created erhalten bleibt als CreationDate. Also in etwa so:
IssueID,CreationDate,Duration A,2016-08-09T14:33:09,1387724 B,2015-09-23T12:22:21,691200
Stellt sich heraus: das ist mit R nicht trivial zu löse, aber auch nicht unmöglich.
1. Schritt
Im ersten Schritt erstelle ich ein Subset ausschliesslich dür den Status created:
created.datetime
2. Schritt
Im zweiten Schritt wird in die Tabelle X eine neue Spalte CreationDate eingefügt mit den Werten aus der Tabelle created.datetime:
X$CreationDate
3. Schritt
Im dritten und letzten Schritt verwende ich das plyr API, um die Tabelle zu reduzieren. Das API wurde zuvor installiert und mittels library(plyr) eingebunden.
Der entsprechende Code sieht wie folgt aus:
reduced <- ddply(X, c("IssueID", "CreationDate"), function(t) data.frame(Duration = sum(t$Duration)) )
Der Übersichtlichkeit halber habe ich den Code in 3 Zeilen dargestellt.
Das Ergebnis sieht wie folgt aus:
> reduced IssueID CreationDate Duration 1 A 2016-08-09 14:33:09 1387724 2 B 2015-09-23 12:22:21 691200
Fazit
Ich bin immer mehr begeistert von R. In Java hätte ich für diesen 3-Zeiler sicherlich ein vielfaches an Code produziert.
Zum selber ausprobieren der Sourcecode zum download.
0 notes
Link
Aus JIRA habe ich mit jan für die Issues eines Projektes alle Status und deren Startzeit ermittelt. Die Daten wurden in eine CSV Datei geschrieben. Dabei durchläuft ein Task immer die Phase created. Um Auswertungen einfacher zu machen hat jan immer noch die Zeit in Minuten, die das Issue in einem Status war, berechnet.
0 notes
Link
Ich arbeite mich gerade ein wenig in R ein, da ich Daten aus CSV Dateien statistisch auswerten möchte. Dabei habe ich viel mit Datumsangaben 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 . 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
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 unterschiedlich, liefern ansonsten allerdings ähnliche Funktionalitä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 Bindestrichen und Doppelpunkten) verwendet. Allerdings mit dem Unterschied, dass nicht der Standarddelimiter T verwendet wird, sondern ein Leerzeichen. 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 übergeben 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 <- transform(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 <- transform(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 <- transform(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 <- transform(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.
0 notes