Jakob Richter

Tipp: nicht-destruktives Arbeiten mit par()

Ein kleiner Tipp, wenn man mal doch mit der in R eingebauten Grafikumgebung arbeiten will und nicht mit ggplot.
Hat man mal ein längeres R-Skript und erzeugt darin verschiedene Grafiken, kommt es häufig vor, dass man für einige bestimmte Einstellungen in par() ändern möchte. Insbesondere vermutlich mfrow=c(2,3) um mehrere Plots neben und untereinander in einer Grafik zusammenzufügen. Wenn dann die nächsten Grafiken wieder einzeln geplotted werden sollen, muss man wieder mühselig die Parameter von par() zurück setzen.
Am elegantesten geht es wohl so:

1
2
3
4
5
6
7
8
9
# ...
# irgendwelcher Code
op <- par(mfrow=c(1,2)) #Einstellen der Grafikparameter
  #2 Plots nebeneinander
  plot(runif(100),runif(100))
  plot(runif(100),runif(100))
par(op) #Alles auf den Zustand davor zurücksetzen
plot(runif(100),runif(100)) #1 Plot alleine
#...

ggplot – eine Einführung

Wie funktioniert das mit ggplot? Ich schwärme ja oft von diesem tollen Packet, wie vermutlich fast jeder, der ggplot (genauer ggplot2) kennen und nutzen gelernt hat. Doch für Einsteiger ist die Struktur oft zuerst verwirrend und der Aufwand scheint nicht den Nutzen wert zu sein. Von dem Gegenteil möchte ich euch nun jedoch überzeugen, gerade auch, weil sich der Aufwand am Ende doch erheblich reduzieren kann.

Die Vorteile von ggplot2:

  • schönere Optik
  • Grafiken können leicht an neue Bedürfnisse angepasst werden
  • Exploration von Daten mit wenig Code und bereits druckfertigen Ergebnissen
  • Erscheinungsbild mit wenig Code sauber veränderbar
  • Viele bereits mitgelieferte Plot-typen

Nachteile:

  • gewisse Einarbeitungszeit
  • Daten für ggplot2 Vorbereiten manchmal unintuitiv

Read the rest of this entry »

R: Berechnung in Variable speichern und gleichzeitig Ausgeben

Wieder ein kleiner Trick für den R-Alltag. Häufig will man eine Berechnung durchführen, das Ergebnis in einer Variable speichern und auch das Ergebnis gleich mal sehen. Zum Beispiel ist es ja nicht schlecht bei der Anpassung eines (linearen) Modells gleich mal die geschätzten Parameter zu sehen, bevor man weiter damit arbeitet.

> (lm.trees <- lm(Height~.,data=trees)) Call: lm(formula = Height ~ ., data = trees) Coefficients: (Intercept) Girth Volume 83.2958 -1.8615 0.5756

apply() hoch 3

Nach dem Beitrag zu lapply() und sapply() möchte ich hier nun das etwas mächtigere (?) apply() vorstellen, was man in R wohl kaum missen will.

Ich werde kurz zeigen wie mit apply() Matrizen und data.frames zeilen- sowie spaltenweise Ausgewertet werden können. Nach dieser sehr leichten Übung widmen wir uns einem etwas trickreicherem Beispiel, in dem wir mehrere gleichartige Tabellen (also Matrizen bzw. data.frames) der gleichen Zeilen- und Spaltenanzahl vorliegen haben. Hier möchten wir die Informationen aus immer den gleichen Zellen zusammenfassen.
Read the rest of this entry »

Kleiner R-Helferling: example()

Hui. Dass es diese Funktion gibt hätte ich ja nicht gedacht. Sicherlich seid ihr schon über die Beispiele in der R-Hilfe gestolpert und habt sie auch mal ausgeführt um zu gucken was passiert. Copy&Paste? Pah! Mit example() geht’s auch schneller. Was kann man nochmal mit predict.glm() machen? Mit example(predict.glm) findest du es heraus. Funktioniert auch ganz gut für viele Beispieldatensätze example(chickwts).
Read the rest of this entry »

Formeln in R (Teil 1)

Formeln (formula) werden in R an vielen verschiedenen Stellen genutzt. Natürlich für die lineare (lm()) und logistische Regression (glm(type="logit")), aber auch für die Survivalanalyse und das Cox-Modell (library("survival"); coxph()) um nur einige Beispiele zu nennen.

Zuerst der ganz allgemeine Aufbau einer formel
abhängige Variable ~ erklärende Variablen
(Ein kleiner Tipp für Mac-Nutzer an dieser Stelle: ~ lässt sich schreiben mit [alt] + N)
Die Formel y ~ x kann also verstanden werden als x erklärt y oder y ist abhängig von x.

Sicherlich bekannt ist, dass wir mehrere erklärende Variablen (EV) mit + verbinden können: y ~ x1 + x2
Doch es gibt zahlreiche weitere Möglichkeiten die rechte Seite der Formel aufzubauen:
Read the rest of this entry »

Zeilen in einer Matrix verdoppeln.

Hier ein kleiner Tipp aus dem R-Praxisleben. Beispiel: In einer Matrix (respektive data.frame) jede Zeile verdoppeln.

1
2
3
4
5
6
daten < - mtcars
 
#Doppelte Zeilen direkt untereinander
daten_doppelt <- daten[rep(1:nrow(daten),each=2),]
#Doppelte untereinander
daten_doppelt2 <- daten[rep(1:nrow(daten),times=2),]

Ja das ist wirklich nicht schwer. Die Grundidee: Die Selektionsvektoren, welche immer in den eckigen Klammern stehen, kann man natürlich auch nutzen um bestimmte Zeilen mehrfach zu wählen.

Damit es nicht nur bei diesem simplen Beispiel bleibt, was vielleicht jedem eingefallen wäre, noch ein paar Ideen, wie man mit dieser simplen Methode auch wesentlich komplexere Verdopplungen durchführen kann.
Read the rest of this entry »

lapply() und sapply() – Der Einstieg in die apply-Funktionen.

Warum gerade lapply() und keine der gebräuchlicheren Funktionen apply Funktionen aus R? Ganz einfach: lapply() ist die Grundfunktion und die anderen Funktionen bauen auf dieser Funktionsweise auf. Da man lapply() nicht nur auf Vektoren, sondern auch auf Listen anwenden kann bietet es ungeahnte (vllt. auch unausdenkbare) Möglichkeiten der Verwendung. Aus diesem Grund ist das Beispiel auch äußerst praxisunrelevant.

Funktionsweise lapply()

Versuch eines Schemas: So ungefähr arbeitet lapply().


Read the rest of this entry »

Schnelleres R dank Kompilierung (also ohne apply())

Inspiriert durch diesen Blogbeitrag wollte ich die Vorkompilierung selbst einmal ausprobieren und auch mit dem so hoch gelobten apply() vergleichen um mich von der Effektivität zu überzeugen.
Read the rest of this entry »

Daten im R-Quelltext hinterlegen.

Ok, dieses Beispiel wird man wohl selten gebrauchen, aber vielleicht mag es mal nützlich sein, wenn man jemandem ein wenig R-Code schicken will, der mit einem Datensatz arbeitet, ihr ihm aber nicht den kompletten Datensatz schicken wollt/könnt/dürft. Gleichzeitig sollte alles in einer Datei sein, damit der Empfänger nicht die Mühe hat alles noch mal einlesen zu müssen.

Funktioniert auch gut, wenn man sich nur selbst ein paar Daten ausdenken will, mit denen man etwas testen möchte. So erspart man sich lästiges c("a","b", usw.).

So geht’s:

1
2
3
4
5
6
datentxt <- "	lcavol	lweight	age	lbph	svi	lcp	gleason	pgg45	lpsa	train
1	-0.579818495	2.769459	50	-1.38629436	0	-1.38629436	6	  0	-0.4307829	T
2	-0.994252273	3.319626	58	-1.38629436	0	-1.38629436	6	  0	-0.1625189	T
3	-0.510825624	2.691243	74	-1.38629436	0	-1.38629436	7	 20	-0.1625189	T"
 
daten <- read.table(textConnection(datentxt))

Die ersten Textzeilen aus dem Prostata-Datensatz markieren, kopieren und dann datentxt <- "HIER" einfügen. Dabei darauf achten keine neuen Zeilenumbrüche einzubauen.