12. Achtung: Flache Lernkurve
„Nehmen Sie sich ein Beispiel an Kindern, die
das Laufen lernen. Mit der Einstellung von
vielen Erwachsenen hätten sie nach dem ersten
Sturz aufgehört und gesagt: "Nee, tut mir leid,
auf zwei Beinen gehen ist nicht mein Ding.“
Dr. Eckart von Hirschhausen
13. R Ressources
• R Project Site: www.r-project.org
• Blogs
• www.r-bloggers.com
• http://ryouready.wordpress.com
• eBooks/Wikis/Sites
•Quick-R website
•http://de.wikibooks.org/wiki/GNU_R
•http://addictedtor.free.fr
• R seek (www.rseek.org)
17. Good to know I
• R arbeitet im Frage-Anwort Modus
• Navigieren in R Konsole durch Aufwärts und Abwärts Pfeile
• Alles hinter der Raute (#) sind Kommentare und wird von R
nicht ausgewertet
• Ein Befehl wird durch ein Semikolon oder durch einen
Zeilenumbruch abgeschlossen
• Ein Befehl darf über mehrere Zeilen gehen
• Dezimalstellen sind Punkte, keine Kommas. Kommas haben
eine andere Funktion
19. Code 2 : Zuweisungen
### Der Zuweisungsoperator ###
a <- 2 + 2! ! # Zuweisungsoperator kleiner-Zeichen
# plus minus-Zeichen
a <- b <- 2 + 2! # möglich aber unschön
a! ! ! ! # Variable a enthält nun Wert
2 + 2 -> a! ! # so rum geht es auch, sollte aber
# nicht verwedenet werden
a = 2 + 2!! # Alternative Zuweisung (wird i.d.R.
# nicht verwendet).
! ! ! ! # Zuweisung wird klarer durch
# Richtungsangabe des Pfeils
a <- 100! ! # keine Warnung, wenn eine Variable
# übergespeichert wird
a * 10
a <- "Ich bin der Inhalt"! # Variablen sind nicht typensicher,
# d.h. sie können Zahlen, Buchstaben
# etc. enthalten
a * 10!! ! # Fehler, da Zeichen mal Zahl
20. Objektbezeichnungen
• Variablen/Objekt-benennung: können alphanumerisch sein
sowie, Punkte und Unterstriche enthalten
• Darf keine Operatoren enthalten (+, - *, / etc.)
• Objektname darf nicht mit Zahl beginnen bzw. Punkt
gefolgt von einer Zahl. #
• Groß- und Kleinschreibung wird unterschieden (Nutzung
zum Strukturieren von Objektnamen)
21. Code 3 : Bezeichnung & Stil
varone <- 1
varOne <- 2! ! # ist eine andere Variable als varone
neueVariable1 <- 7
neueVariable2=neueVariable1+2! ! # kaum lesbar! schlechter
Stil!
neueVariable2 <- neueVariable1 + 2! # besser, sauber getrennt
22. Code 4 : Logik
### Hierarchie der Datentypen in R. ###
# Jede höhere Stufe kann auch die tieferen repräsentieren
NULL! ! ! # die leere Menge, unterstse Stufe
TRUE! ! ! # logische Werte
3.14! ! ! # ganze und reelee Zahlen
2.13+3i! ! ! # komplexe Zahlen
"Hallo"! ! ! # Buchstaben und Zeichen
26. Funktionen I
Funktion (lat. functio = Tätigkeit,Verrichtung)
z.B.:
c() steht für concatenate (verbinden, verketten)
> a <- c(1,2,3)
> a
[1] 1 2 3
rnorm() für random normal distribution
> rnorm(4)
[1] -0.3628728 -0.4580532 -1.3729865 -1.5834625
27. Funktionen II
Die Angaben innerhalb einer Klammer von
Funktionen heißen Argumente.
> rnorm(4)
[1] -0.3628728 -0.4580532 -1.3729865 -1.5834625
Jede Funktion hat ein definiertes Set an Argumenten,
die sie verarbeiten kann (s. Dokumentation)
> ?rnorm
Um sich alle möglichen Argumente anzeigen zu lassen
> args(rnorm)
28. Funktionen III
Jede Funktion gibt ein Objekt zurück
> c(1,2,3)
[1] 1 2 3
Ggf. kann dies auch unsichtbar geschehen
v <- rnorm(100)
hist(v)
a <- hist(v) # Rückgabe der Funktion speichern
a
Falls eine Funktion nichts spezifisches zurückgibt,
gibt sie ein NULL Objekt zurück
a <- plot(1:10)
a
29. Code 8 : Hilfe!
### HELP R ###
help.start()!! ! # Hilfe aufrufen. Auch über das
# Menü möglich
?mean! ! ! ! ! # Hilfe zur Funktion "mean"
help(mean)! ! # identisch! !
help("mean")!! # identisch! !
apropos() ! ! ! ! # alle Objekt, die mean enthalten
help.search("mean") ! # oder
??mean
30. Code 9 :Vorgriff Datentyp Vektor
# Vorgriff auf Datentyp Vektoren (mehr später)
c()! ! ! ! !
! # concatenate (deu. "verbinden")
?c
c(1,2,3)! ! ! ! # numerischer Vektor
! ! ! ! ! ! # Zahl am Anfang des Outputs gibt
# Nr. des Elements
a <- c(1,2,3)! ! # Speichern in einer Variablen
c(a,a)!
! ! ! ! # Verknüpfen von zwei Variablen
c(1,2,a)! ! ! ! # Verknüpfen von Zahlen und Variablen
b <- c(1,2,a,c(1,1))! # flexible Verknüpfungen sind möglich
d <- c(eins=1, zwei=3)! named vector, die Elemente haben Namen
#
31. Code 10 : Sequenzen
# Vektorsequenzen erzeugen
?seq
seq(from=1, to=5)! ! # Sequenz von 1 bis 5
seq(from=1, to=5, by=.5) # von 1 bis 5 in Schritten von 0.5
seq(1,20)!! ! ! # von eins bis 20
1:20 ! ! ! ! ! # Kurzschreibweise
10:20! ! ! ! ! # von 10 bsi 20
(-10):10! ! ! ! # von -10 bis 10
?rep
rep(x=1, times=10)
rep(x=c(1,2), times=10)
rep(x=c(1,2), times=c(3,5))
rep(x=c(1,2), each=2)
rep(x=c(1,2), each=2, times=10)
rep(x=c(1,2), each=2, length=8)
33. Code 11 : Wichtige Funktionen
# Wichtige Funktionen
all()! ! ! # Sind alle Elemente TRUE
any()! ! ! # Ist mindestens ein Element TRUE
which()! ! ! # Welche Elemente sind TRUE
a <- c(1.2, 3.3, 6.1, 4.6)
max()! ! # Maximum
min()! ! # Minimum
sqrt()!! # Quadratwurzel
round()! ! # runden
sum()! ! # Summe
mean()!! # Mittelwert
length()! # Länge des Vektors
rnorm()! ! # zufällige NV Werte generieren
34. Code 12 : Konstanten
# in R eingebaute Konstanten
LETTERS! ! ! # Großbuchstaben von A bis Z
letters! ! ! # Kleinbuchstaben von a bis z
month.name! ! # englische Monatsnamen
month.abb!! # englische Monatsnamen abgekürzt
pi! ! ! ! # die Zahl Pi
35. Code 13 : Strings
# Umgang mit Strings / Zeichen
?print
print("Hallo")! ! # Drucken von "Hallo" in der Konsole
print(1+1)! ! ! # Ausruck wird erst ausgewertet, dann gedruckt
?paste!
! ! ! ! # Konvertierung in characters und verbinden
paste(1)! ! ! ! ! ! ! ! ! ! ! !
paste(1:3)
paste(1, "A")
paste(c(1:3), c("A", "B", "C"))!! # Vektorweise
paste(c(1:3), c("A", "B"))! ! ! # recycling des kürzeren
# Vektors bei ungleicher Länge
paste(1, "A", sep="")! ! ! ! ! # Seperatorzeichen festlegen
paste(c(1:3), c("A", "B", "C"), sep="")! # Seperator festlegen!
paste(c(1:3), c("A", "B", "C"), sep="_")! # Seperator festlegen
paste(c(1:3), c("A", "B", "C"),
sep="_", collapse=" ")! ! # Trennzeichen zum Kollabieren
paste(c(1:3), c("A", "B", "C"), sep="_", collapse="_")
36. Your turn!
Erzeuge folgende Ausgabe in der Konsole, indem
Du paste() und die Konstante month.name nutzt.
"January is month number 1" "February is month number 2"
"March is month number 3" "April is month number 4"
"May is month number 5" "June is month number 6"
"July is month number 7" "August is month number 8"
"September is month number 9" "October is month number 10"
"November is month number 11" "December is month number
12"
37. Code 14 : Strings
?cat! ! ! # Ausgabe der und Aneinanderhängen der Objekt
cat("Hallo")!! ! ! ! ! ! ! # Ausgabe von Hallo auf der
Konsole
cat("Hallo", "wie gehts?")! ! ! # Ausgabe von EINEM Text
cat("Ich bin Jonny Nr.", 5)! ! ! # Mischen von Zahlen und Text
cat("IQ hat einen mean von :", 100,
! "und eine sd von:", 15)! ! ! # Zahlen und Text
alter <- 31
cat("Ich bin", alter, "Jahre alt.")! # Variablen und Text
!
cat("Eins plus Eins ist", 1 + 1)! ! # Ausdrücke werden erst
# ausgewertet!
cat("Dieser Satz hat einen Umbruch n und geht dann weiter.")
# Umbruch durch n
cat("Ein Tabulator t mitten im Satz.")! # Tabulator durch t
cat("Anführungsstriche 'Test' im Text")! # Anführungsstriche
cat("Anführungsstriche "Test" im Text")! Escape Symbol
#
38. Your turn!
Du hast folgenden Vektor: v <- c(1,2,3,4,5).
Erzeuge folgende Ausgabe in der Konsole:
Der Vektor v hat die Länge 5
Er besteht aus folgenden Elementen: 1 2 3 4 5
Tip: Benutze hierzu die Funktion cat() und length() und
kombiniere Variablen und Text.
39. Your turn!
Erzeuge folgende Ausgabe in der Konsole, indem
Du cat(), paste() und die Konstant month.name nutzt.
January is month number 1
February is month number 2
March is month number 3
April is month number 4
May is month number 5
June is month number 6
July is month number 7
August is month number 8
September is month number 9
October is month number 10
November is month number 11
December is month number 12
Die Ausgabe soll nun pro Zeile erfolgen
40. Code 15 : vectorwise
# Vektorwertiges Arbeiten
a <- 1:3
b <- 3:1
a - b! ! ! ! ! ! ! # Vektorweise Substraktion
a*b! ! ! ! ! ! ! # Vektorweise Multiplikation
!
c(1,2,3,4) - c(1,2)!
! ! ! # Was kommt da raus?
(x <- c(4.1, 5.0, 6.35) * 2)! # Multiplikation für
# jedes Element
x + 5:7! ! ! ! ! ! # Addition für jedes Element
3:5 - 1:6!! ! ! ! ! # Recycling
3:5 - 2:3!! ! ! ! ! # Recycling mit Warnung
41. Code 16 : Zugriff
# Zugriff auf Elemente eines Vektors
b <- c(1,2,3,4,5)! ! ! # numerischer Vektor
b[1]! ! ! ! ! ! ! # erstes Element
b[c(1,2,3)]! ! ! ! ! # Elemente 1,2,3
b[1:3]!
! ! ! ! ! ! # Elemente 1,2,3
42. Code 17 : Anwendung BMI
### BMI BEISPIEL FÜR INTERAKTIVE NUTZUNG ###
68/1.70^2 # Body Mass Index.
# Um den Wert weiterzubenutzen in ein Objekt speichern
myBmi <- 68/1.70^2
myBmi
myBmi.2 <- myBmi
2bmi <- myBmi ! ! ! # Fehler, weil Objektname mit Zahl beginnt
weight <- c(68, 50, 88, 73)! ! # Vektor mit Gewichtsdaten
weight
height <- c(1.70, 1.63, 1.90, 1.78) # Vektor mit Größen in m
height
68 / 1.70^2! ! ! ! ! ! ! # BMI für die erste Person
weight[1]/height[1]^2! ! ! ! # BMI für die erste Person
# Wie berechne ich nun den BMI für alle?
bmi <- weight/height^2!
! ! ! # vektorwertig, intuitiv?
44. Code 19 : Anwendung BMI
(bmi[1] – mean.bmi)^2 + (bmi[2] – mean.bmi)^2 +
(bmi[3] – mean.bmi)^2 + (bmi[4] – mean.bmi)^2! # SSQ
(bmi - c(mean.bmi, mean.bmi, mean.bmi, mean.bmi))^2
# wie kann ich es einfacher schreiben
(bmi – mean.bmi)^2! ! ! ! ! ! # mit recycling!
!
sum((bmi – mean.bmi)^2)! ! ! ! # SSQ
sd.bmi <- sqrt(sum(bmi – mean.bmi)^2)/n-1)# Wurzel aus SSQ geteilt
# durch n-1
n <- 4
sd.bmi <- sqrt(sum(bmi – mean.bmi)^2)/n-1)
sd(bmi)! ! ! ! # so ist es natürlich viel einfacher
45. Take along!
Selbst wenn etwas nicht in
R nicht existiert, kann
man es sich selber
programmieren!
46. Your turn!
Berechne die geschätzte Kovarianz für folgende
zwei Datenreihen in R „zu Fuß“
x <- c(-2,-1,-1,0,1,1,2)
y <- c(-1,-2,1,0,2,-1,1)
47. Code 20 : Navigieren
# Projektordner anlegen /RCourse
# Navigieren in Verzeichnissen
getwd() !! ! # Unterschied Slash/Backslash
Windows
setwd() ! ! ! ! # Arbeitsverzechnis setzen
setwd("/Users/markheckmann/RCourse")
# in Verzeichnis RCourse wechseln
setwd("..") ! ! ! # ein Verzeichnis runter
setwg("testdir")! ! # ein Verzeichnis hoch
setwd("../testdir")! # eins runter und wieder eins hoch
!
48. Your turn!
Lege ein Verzeichnis RCourse an und setze es als neues
Arbeitsverzeichnis. Lege eine Unterordner data an und wechsele in
ihn. Wechsel anschließend wieder in den übergeordneten Ordner.
49. Code 20b : Arbeitsbereich
### Workspace speichern / History speichern
?savehistory()
savehistory("Befehle_von_Tag_1.history")
loadhistory("Befehle_von_Tag_1.history")
?save.image()
save.image("erster Kurstag.RData")! # Arbeitsbereich speichern
ls()! ! ! ! ! ! ! ! # Alle Objekte im Arbeitsbereich
# anzeigen
rm()! ! ! ! ! ! ! ! # Objekte aus Arbeitsbereich löschen
rm(list=ls)! ! ! ! ! ! # Alle Objekte aus Arbeitsbereich
löschen
load("erster Kurstag.RData")!# den zuvor gespeicherten
# Arbeitsbereich laden
ls()! ! ! ! ! ! ! ! # Objekte sind wieder da
50. Your turn!
Berechne die Korrelation für folgende zwei Datenreihen in R „zu
Fuß“. Konstruiere die Lösung so, dass man x und y (gleich lang)
austauschen kann, ohne den Code sonst zu verändern.
x <- c(-2,-1,-1,0,1,1,2)
y <- c(-1,-2,1,0,2,-1,1)
51. Code 21 : Datentypen
### Datentypen ###
### Hierarchie der Datentypen in R. ###
# Jede höhere Stufe kann auch die tieferen repräsentieren
NULL! ! ! # die leere Menge, unterste Stufe
TRUE! ! ! # logische Werte
3.14! ! ! # ganze und reelee Zahlen
2.13+3i! ! ! # komplexe Zahlen
"Hallo"! ! ! # Buchstaben und Zeichen
# Datenobjekte in R – ALLES in R ist ein Objekt
1 !! ! # numeric
"Hallo"! ! # characters
NA! ! ! # missing value
NaN! !
! # Not a number
53. Quiz 1 !
Welche Regeln gibt es für die Benennung von Objekten?
Welche Regeln gibt es für leserlichen Code?
Welche Objektnamen sind erlaubt?
a1234
ausdruck
Variable
.Variable
Variable.
_Variable
Variable_
1teVariable
.1Variable
Überlege was folgende Ausdrücke ergeben:
11 %% 5
1:6 %% 2
11 %/% 5
10:19 %/% 5
55. Quiz 3 !
Überlege was folgende Ausdrücke ergeben:
1:5 > 2
c(-1,2,3,5) == min(c(-1,2,3,5))
6 + 1:4
6:1 - 3:1
3*FALSE - TRUE*5
c(T,F,T,F,T) == 1
c(T,F,T,F,T) == FALSE
x <- c(1,5,2,0,6,2,9)
Suche die Stelle des Vektors x raus, der zu der niedrigsten
Zahl sowie zu der höchste Zahl gehört. Ordne die beiden
Werte dann in einem Vektor an.
56. Quiz 4 !
Überlege was folgende Ausdrücke ergeben:
seq(10, 1, -1)
seq(10, 1, 1)
rep(1:3, times=3:1)
rep(rep(1:2, t=1:2), t=1:3)
rep(1:3, l=5)
LETTERS[2:4]
Erzeuge folgende Vektoren:
[1] "a" "c" "e" "g" "i" "k" "m" "o" "q" "s" "u" "w" "y"
[1] "B=2" "D=4" "F=6" "H=8" "J=10"
Erzeuge einen Vektoren mit NV Zufallszahlen der Länge 10 und runde ihn auf eine
Dezimalstelle.
57. Code 22 :Vektoren
### vector – eindimensionales Datenobjekt ###
a <- c(T, F, T, F)! ! ! ! # logischer Vektor
a <- c(1,2,3,4,5)! ! ! ! # numerischer Vektor
a <- c("A", "B", "C")! ! ! # character Vektor
?vector! ! ! ! ! ! ! # Hilfe zu vector() aufrufen
vector("logical", length=10)!# log. Vektor der Länge 10 erzeugen
vector("numeric", length=10)!# num. Vektor der Länge 10 erzeugen
vector("character", length=10)! # char Vektor d. L. 10 erzeugen
c(TRUE, 2, FALSE)! ! ! ! # innerhalb eines Vektors stets
# nur ein Typ möglich
c(T, "A", 1)!! ! ! ! # Automatische Umwandlung auf
# niedrigstes mögliches Datenniveau
58. Code 23 :Vektoren
# Zugriff auf eine Elemente durch eckige Klammern und Angabe der
Position oder des Namens, sofern es ein „named vector“ ist.
a[1]! ! ! ! ! # Zugriff auf erstes Element des Vektors
a[c(1,2)]!! ! ! # Zugriff auf die ersten beiden Elemente des
Vektors
a[c(2,1)]!! ! ! # umgekehret Reihenfolge
a[c(T,F,F)]! ! ! ! # Zugriff durch TRUE/FALSE Vektor
a[c(T,F)]!! ! ! # Wieso 2 Elemente?
b <- c(a=1, b=2, c=3)! # Erstellen eines "named" vectors
names(b)! ! ! ! # Namen der Vektorelemente anzeigen
b["c"]!
! ! ! ! # Zugriff nun auch über den Namen des
# Elements möglich
a[-1]! ! ! ! ! # negatives Indizieren
a[c(-1,-2)]! ! ! ! # negatives Indizieren
59. Code 24 :Vektoren
x <- c(NA, 1, 2, NA, 99)! # Vektor mit missing values (NA)
x == 1!! ! ! ! ! # welcher Eintrag ist gleich 1
x > 1! ! ! ! ! ! # welche Einträge sind größer 1
x == NA! ! ! ! ! # welcher ist NA? so falsch
is.na(x)! ! ! ! ! # Funktion is.na() nutzen
which(is.na(x))!! ! # Einträge mit welchem Indizes sind NA?
x[!is.na(x)]!! ! ! # Einträge auswählen, die nicht NA sind
x[x==99] <- NA! ! ! # Einträge der Zahl 99 mit NA
überschreiben
60. Your Turn!
Oftmals wird 99 oder 999 als Platzhalter für missing values
benutzt. Ersetze alle Werte des Vektors, die 99 oder 999
sind mit NA.
x <- c(1,4,3,99,4,3,999,99,3,6,999)
61. Your Turn!
v <- 1:10
Setze alle Elemente des Vektors v, die kleiner gleich 3 sind
auf 0, alle die zwischen 4 und 7 sind auf 1 und alle größer
sieben auf NA.
[1] 0 0 0 1 1 1 1 NA NA NA
62. Code 25 : Matrix
### matrix – zweidimensionales Datenobjekt ###
?matrix
matrix(1:12, nrow=3, ncol=4)!! ! ! # Matrix erstellen
matrix(1:12, nrow=3, ncol=4, byrow=TRUE)! # Matrix reihenweise
x <- 1:12
dim(x) <- c(3,4)! ! ! ! # Dimensionsattribut ändern
x
dim(x) <- c(12)!! ! ! ! # zurück zu Vektor
dim(x) <- c(3,4)! ! ! ! # Wieder als Matrix
e <- matrix(c(1,0,0,0,1,0,0,0,1), 3, 3)! ! # Einheitsmatrix
diag(3)! ! ! ! ! ! ! # Einheitsmatrix per Funktion
is.matrix()
63. Your Turn!
Erzeuge eine Matrix M mit 20 Spalten und den folgenden
Zeileneinträgen:
Zeile 1: 1, 2, ..., 20
Zeile 2: Zahlen zwischen 2 und 40 mit Abstand 2
Zeile 3: Spalte 1-10 mit Eintrag 1, Spalte 11-20 mit Eintrag 2
Zeile 4: 1,1,2,2,1,1,2,2,...
Zeile 5: 1,1,2,2,3,3,4,4,4,4,5,5,5,5,6,6,6,6,6,6
Zeile 6: 1,2,2,2,3,3,3,3,3,3,1,2,2,2,3,3,3,3,3,3
Quelle: Foliensatz von Peter Ruckdeschel / Matthias Kohl. R/S-plus für Einsteiger und Fortgeschrittene
64. Code 26 : Matrix
# auf Matrixelemente zugreifen
x[1,1]!
! ! ! ! # Element erste Zeile, erste Spalte
x[ ,1]!
! ! ! ! # komplette erste Spalte
x[ ,1:2]! ! ! ! # komplette erste und zweite Spalte
x[1, ]!
! ! ! ! # komplette erste Zeile
x[1:2, 2:3]! ! ! # erste & zweite Zeile, zweite & dritte
# Spalte
x[c(1,3), c(2,4)]
x[-1, -2]!! ! ! # negatives Indizieren; ohne Zeile 1
# und Spalte 2
x[c(T, F, T), T]! # Auswahl funkioniert auch über T/F
x[c(T, F, T), c(F,F,T,T)]
x > 5! ! ! ! ! # welche Elemente sind größer 5
is.na(x)! ! ! ! # Welche Einträge der Matrix sind NA?
65. Code 26 : Matrix
# Matrixelemente verändern
x[1,1] <- 10!! ! # Zahl zu einer Zelle zuweisen
x[ ,1] <- 10!! ! # Zahl zu Spalte zuweisen mit
# Recycling
x[1, ] <- 10!! ! # Zahl zu Zeile zuweisen
x[1, 2:3] <- c(100,100)! # Zwei Zellen verändern
x[c(T, F, T), T] # Auswahl funkioniert auch über
# TRUE/FALSE
x[c(T, F, T), c(F,F,T,T)]
66. Code 27 : Matrix
# Zeilen und Spaltennamen hinzufügen
colnames(x)! ! ! ! # Spaltennamen anzeigen
rownames(x)! ! ! ! # Zeilennamen anzeigen
colnames(x) <- c("Winter", "Frühling", "Herbst", "Winter")!
# Spaltennamen setzen
rownames(x) <- c("A", "B", "C")! # Zeilennamen setzen
x[, "Winter"]! ! ! ! ! # Zugriff über Namen
x[, c("Winter", "Frühling")]!
x[, c(1, "Winter")]! ! !
! # geht nicht, da 1 in einem
# String konvertiert wird!
rownames(x) <- NULL # Zeilennamen löschen
colnames(m)! ! ! ! ! # Spaltennamen
colnames(m)[4]! ! ! ! # Viertes Element
colnames(m)[4] <- "April"! Viertes Element verändern
#
m
68. Code 28 : Matrix
# Reihenfolge der Spalten der Matrix ändern
m[, c(1,3,5,7,9,11,2,4,6,8,10,12)]! !
index <- c(1,3,5,7,9,11,2,4,6,8,10,12)
m[, index]
m[, c(12:1)]
69. Code 29 : Matrix
# Matrizen verbinden
cbind ! ! ! # verbinden der Spalten (gleiche Zeilenanzahl
# nötig)
cbind(m, m)! # m mit m verbinden!
! !
cbind(m[1:3, 1:3], m[1:3, 9:12])!
cbind(m[1:2, 1:3], m[1:4, 1:3])!! # Ungleiche Zeilenanzahl
rbind # verbinden der Zeilen (gleiche
# Spaltenanzahl nötig)
rbind(m, m)! ! ! ! ! # m zweimal untereinander
rbind(m[1:3, 1:3], m[18:20, 1:3])! # Oberen und unteren
# Teil von m verbinden
rbind(m[1:3, 1:3], m[18:20, 3:5])! # Achtung Spaltennamen der
# ersten Matrix werden genutzt
70. Your Turn!
1) Erzeuge eine Matrix M mit 7 Spalten und 7 Zeilen aus
zufälligen NV-Werten, die auf eine Stelle gerundet werden.
2) Folgende Zellen sollen nun durch 999 ersetzt werden:
(1,1) (4,3) (4,4) (1,7)
3) Alle Einträge die 999 enthalten sollen NA gesetzt werden.
Quelle: Foliensatz von Peter Ruckdeschel / Matthias Kohl. R/S-plus für Einsteiger und Fortgeschrittene
71. Code 30 : Matrix
### Rechnen mit Matrizen
A <- matrix(c(1,3,2,5,2,3,1,2,3), ncol=3)
A
t(A)! ! ! ! ! # transponieren einer Matrix
A + A! ! ! ! ! # Zellenweise Addition
A * 4! ! ! ! ! # Jede Zelle mal vier
A * A! ! ! ! ! # Zellenweise Multiplikation
A^2!
A %*% A! ! ! ! # Matrixmultiplikation
Ainv <- solve(A)! # Inverse einer quadratischen Matrix
A %*% Ainv! ! ! # Inverse Mal Matrix = Einheitsmatrix
Ainv %*% A! !
A %*% solve(A)
rbind(A, A)! ! ! ! # Zeilen verbinden
cbind(A, A)! ! ! ! # Spalten verbinden
cbind(A, rep(1,3))! ! # eine Spalte anhängen
rbind(A, A) %*% cbind(A, A)! # Beispiel
72. Your turn!
Berechne die Matrix b der Regression y
regrediert auf x in Matrizenform
x <- c(-2,-1,-1,0,1,1,2)
y <- c(-1,-2,1,0,2,-1,1)
Beachte: die Designmatrix X enthält
eine Spalte mit Einsen für die Konstante!
73. Code 31 : Faktoren
### factors - für qualitativ unterschiedliche Merkmale
val <- c(1,2,1,1,1,2,3,3)!! ! ! # neuer Vektor
f <- factor(val, levels=1:3)!! ! # factor erzeugen mit
# Levels 1 bis 3
f
levels(f)!! ! ! ! ! ! # Bezeichnung der Levels
levels(f) <- c("Treatment 1", "Treatment 2", "Control")
# Neue Level Bezeichnungen
f
# Umwandeln eines vector in factor
x <- c(1,1,2,2,3,3)! ! # neuer Vektor
!
x <- as.factor(x)! ! ! # umwandeln in factor
x
levels(x)!! ! ! ! # Bezeichnung der Levels
levels(x) <- c("Treatment 1", "Treatment 2", "Control")
# Neue Level Bezeichnungen
74. Your turn!
Erzeuge einen factor der folgenden Form:
[1] Gruppe 4 Gruppe 4 Gruppe 4 Gruppe 4
Gruppe 3 Gruppe 3 Gruppe 3 Gruppe 2 Gruppe 2
Gruppe 1
Levels: Gruppe 1 Gruppe 2 Gruppe 3 Gruppe 4
75. Code 31 : Listen
### lists / Listen - Datentyp ###
bmi.class1 <- c(20,23,26,18)
bmi.class2 <- seq(20, 30, by=2)
bmi.class3 <- 20:35
# --> passen nicht in Matrix, da sie unterschiedliche Anzahl an
Einträgen haben
l <- list(bmi.class1, bmi.class2, bmi.class3)!
# Erstellen einer Liste
l! ! ! !
l[[1]] ! ! ! # Auf Listenelemente wird mit einer
# doppelten eckigen Klammer zugegriffen
l[[1]][1:3]! ! # Auswahl des ersten Listenelements und
# innerhalb diesem das erste bis dritte Element
l[1]! ! ! # Listenelement 1 noch als Liste
l[1:2] ! ! # Listenelemente 1 und 2
l[-1]! ! ! # negatives indzieren
76. Code 32 : Listen
l <- list(mathe=bmi.class1, bio=bmi.class2,
deutsch=bmi.class3)! # benannte Liste
names(l)! ! ! ! ! # Namen der Liste anzeigen
l[["deutsch"]]! ! ! # Zugriff auf Listeneintrag per Namen
l$deutsch!! ! ! ! # äquivalent: Zugriff mit Dollar
Operator
l$deutsch[5]!! ! ! # Fünftes Element des Listenelements
# deutsch
l <- list(bmi.class1, bmi.class2, bmi.class3) # Liste ohne
# Namen erzeugen
names(l) <- c("mathe", "bio", "deutsch")! # Namen nachträglich
# hinzufügen
l
77. Code 33 : Listen
l <- list(Jahreszeiten=m, mathe=bmi.class1)!
# Liste kann unterschiedliche Objekt enthalten
l[[1]]!
! ! # Erstes Listenelement ist eine Matrix
is.matrix(l[[1]]) ! ! # Ist das erste L-Element eine Matrix?
is.matrix(l$mathe)! ! # Ist L-Element mathe eine matrix?
is.vector(l$mathe)! ! # Ist L-Element mathe ein Vektor?
l[[2]] <- diag(3)! ! # L-element 2 d. Einheitsmatrix ersetzt
l[[1]][1] <- 999! ! # einen einzelnen Eintrag verändern
l <- l[3:1]! ! ! ! # Reihenfolge der Listenelemente ändern
l<- rev(l)! ! ! ! # Listenreihenfolge umkehren
78. Your turn!
Erstelle eine Liste l, bei der:
das erste Element ein Vektor der Großbuchstaben A bis M ist
das zweite Element die Zeichenkette "Ich bin das zweite Element"
das dritte Element eine Matrix (5x5) mit zufälligen Werten mit 1
Dezimalkommastelle enthält. Z.B. so:
[[1]]
[1] "A" "B" "C" "D" "E" "F" "G" "H" "I" "J" "K" "L" "M"
[[2]]
[1] "Ich bin das zweite Element"
[[3]]
[,1] [,2] [,3] [,4] [,5]
[1,] 0.9 0.3 0.5 0.6 2.4
[2,] -0.9 -0.7 1.5 -1.1 -1.2
[3,] -1.2 0.9 0.4 -1.7 0.2
[4,] -0.4 -0.1 0.2 0.0 0.8
[5,] 1.3 -1.1 -0.7 0.0 1.1
79. Your turn!
Füge nun noch folgende Namen zu den Listenelementen hinzu:
Buchstaben, Text, Matrix.
Dann ändere alle Einträge der Matrix, die kleiner als 0 sind, in NAs
um, kürze den Vektor Buchstaben auf A bis F und kehre die
Reihenfolge der letzten beiden Listenelemente um.
$Buchstaben
[1] "A" "B" "C" "D" "E" "F"
$Matrix
[,1] [,2] [,3] [,4] [,5]
[1,] 0.7 0.5 NA 0.8 0.7
[2,] NA 0.9 NA NA 1.5
[3,] NA 1.3 1.3 NA NA
[4,] 0.7 NA 1.1 NA 0.0
[5,] NA 1.1 NA NA 1.6
$Text
[1] "Ich bin das zweite Element"
80. Code 34 : data frames
### data frames ###
# in Matrizen müssen alle Einträge vom selben Typ sein. Z.B
# alles numerisch oder alles characters. data frames sind
# spezielle Listen und können deshalb pro Spalte
# unterschiedliche Typen enthalten (Faktoren, numerische Werte,
# Characters). Im Ggs. zur Liste müssen sie jedoch stets
dieselbe Anzahl von Einträgen pro Spalte aufweisen.
treat <- c(20, 21, 23, 18, 30)
control <- c(19, 21, 20, 23, 18)
d <- data.frame(treat=treat, control=control)
d$treat! ! ! ! ! ! ! # Zugriff mit Dollaroperator
d[["treat"]]!! ! ! ! # gibt Vektor zurück
is.vector(d[["treat"]])! ! # gibt Vektor zurück
d[,1]
81. Code 35 : data frames
d["treat"]! ! ! ! ! ! # gibt data frame zurück
is.data.frame(d["treat"])!! # gibt data frame zurück
d[1]
d[1:3, ]! ! ! ! ! # Zeilen 1 bis 3, alle Spalten
d[1:3, 1:2]! ! ! ! # Zeilen 1 bis 3, Spalten 1 und 2
d[1:3, c("treat", "control")]! # identisch
d[-1,]!
! ! ! ! ! # ohne erste Zeile
d[-(1:2), -1]! # ohne erste beiden Zeilen, ohne
# erste Spalte
f <- factor(c("m", "m", "w", "w", "w"))
data.frame(Geschlecht= f, treat, control)
82. Your turn!
konstruiere folgenden data frame:
(IQ normalverteilt um 100 mit sd=15; BMI normalverteilt um 20, sd=5)
Geschlecht Intervention IQ BMI
1 m Control 94.8 22.5
2 m Treat 113.1 19.6
3 m Placebo 107.1 24.3
4 m Control 108.8 9.2
5 m Treat 102.4 24.5
6 m Placebo 104.8 23.0
7 m Control 90.6 17.9
8 m Treat 102.9 18.0
9 m Placebo 105.4 17.7
10 m Control 105.4 14.4
11 w Treat 107.9 16.0
12 w Placebo 108.8 18.9
13 w Control 93.7 19.5
14 w Treat 113.8 19.4
15 w Placebo 70.7 16.4
16 w Control 79.1 21.8
17 w Treat 116.5 22.3
18 w Placebo 106.3 19.2
19 w Control 133.6 20.4
20 w Treat 79.2 23.3
84. Quiz 1 !
Kehre die Elemente des folgenden Vektors um
[1] 1 1 1 2 2 3
Schreibe dann eine Befehlsfolge, die die Reihenfolge der
Elemente eines beliebigen Vektors umkehrt, also auch
funktioniert, wenn der Vektor ein anderer ist
Erzeuge folgenden data frame mit beliebigen Werten
IQ schulnote
1 95.9 3
2 83.0 2
3 104.7 4
4 99.6 3
5 87.0 3
6 88.4 5
7 84.1 3
8 106.5 5
9 108.6 3
10 105.6 3
85. Quiz 2 !
Ändere folgende Zellen des data frame in NA: (1,1) (5,2)
Füge eine Spalte an, in dem sich 0 und 1 abwechseln an den data
frame an und gib ihr den Namen "dummy"
Erzeuge eine Liste, die den data frame als ersten Eintrag enthält
Ändere nun die Zelle (2,2) des data frames (erstes Listenelement)
in der Liste auf NA
86. Code 36-37 : Subsets
### data frames subsetting
d[4]! ! ! ! ! ! # Auswahl der vierten Spalte
d[1:3]!! ! ! ! ! # Spalten 1 bis 3
d[c("Geschlecht", "IQ")]! # Nur Geschlecht und IQ
d[-1]! ! ! ! ! ! # alle Spalten bis auf erste
d[c(T,F,T,F)]! ! ! ! # Jede zweite Spalte
d[c(T, F)]! ! ! ! ! # Jede zweite Spalte
d[c(F, T)]! ! ! ! ! # Jede zweite Spalte
d["IQ"] > 107! ! ! ! # Welche IQ Werte sind > 107
index <- d["IQ"] > 107!! # in Index speichern
d[index, ]! ! ! ! ! # Zeilen auswählen mit IQ > 107
cbind(d, d$IQ > 107 )! ! # Spalte anfügen, die zeigt, ob
# IQ Werte größer 107 sind
87. Your turn!
baue den vorher erzeugten Datensatz um: a) erst die
ungeraden, dann die geraden Zeilen kommen b) neue Spaltenreihenfolge
IQ BMI Geschlecht Intervention
1 109.9 18.9 m Control
3 101.2 18.7 m Placebo
5 111.4 14.7 m Treat
7 104.6 17.3 m Control
9 103.7 24.9 m Placebo
11 97.1 16.0 w Treat
13 89.7 28.7 w Control
15 103.2 20.5 w Placebo
17 86.6 29.4 w Treat
19 89.6 28.3 w Control
2 109.1 18.7 m Treat
4 110.1 18.0 m Control
6 110.3 22.2 m Placebo
8 123.5 23.2 m Treat
10 107.6 17.8 m Control
12 104.2 20.1 w Placebo
14 69.2 21.1 w Treat
16 96.9 31.0 w Control
18 103.9 14.5 w Placebo
20 96.4 17.5 w Treat
88. Code 38 : Subsets
names(d)=="IQ"! ! ! # welche Namen sind gleich "IQ"
d[names(d)=="IQ"]! ! # subsetting mit logischem Vektor
names(d)!="IQ"! ! ! # welche Namen sind nicht "IQ"?
d[names(d)!="IQ"]! ! # Spalten, die nicht "IQ" sind auswählen
d[,names(d)!="IQ"]! ! # Identisch
index <- d$IQ > 100 & d$Geschlecht=="m"
# welche Fälle sind Männer mit einem IQ > 100
d[index,]!! # auswählen
d[d$Intervention=="Control" | d$Intervention=="Treat",]! !
# Intervention ist Control oder Treat
d[d$Intervention %in% c("Control", "Treat"),]! ! ! !
# alternative Schreibweise
89. Your turn!
Wähle aus dem Datensatz alle Fälle aus, die weiblich sind
und zur Treatmentgruppe gehören
Geschlecht Intervention IQ BMI
11 w Treat 123.8 21.5
14 w Treat 96.3 28.5
17 w Treat 104.3 20.4
20 w Treat 94.8 14.5
90. Your turn!
Wähle aus dem data frame jene Fälle aus, die einen IQ innerhalb des
Bereichs 90-110 haben und zugleich Männer sind
Geschlecht Intervention IQ BMI
1 m Control 109.9 18.9
2 m Treat 109.1 18.7
4 m Control 110.1 18.0
5 m Treat 111.4 14.7
6 m Placebo 110.3 22.2
8 m Treat 123.5 23.2
10 m Control 107.6 17.8
92. Your turn!
Wähle aus dem Datensatz mit subset alle Fälle aus, die einen IQ
größer als der Durchschnitt haben, der berechnet wird.
Geschlecht Intervention IQ BMI
1 m Control 102.5 16.7
2 m Treat 102.3 18.9
3 m Placebo 101.8 18.2
5 m Treat 106.7 21.0
10 m Control 118.9 15.7
11 w Treat 123.8 21.5
12 w Placebo 104.8 24.4
13 w Control 105.7 13.1
15 w Placebo 100.7 19.2
17 w Treat 104.3 20.4
19 w Control 105.0 10.8
93. Your turn!
Wähle aus dem Datensatz mit subset alle Fälle aus, die a) einen IQ
außerhalb des Durchschnitts (90-110) haben.
Geschlecht Intervention IQ BMI
6 m Placebo 84.5 22.2
7 m Control 80.7 13.8
10 m Control 118.9 15.7
11 w Treat 123.8 21.5
16 w Control 78.9 25.6
... und b) zugleich weiblich sind
Geschlecht Intervention IQ BMI
11 w Treat 123.8 21.5
16 w Control 78.9 25.6
94. packages laden
Die R-base Installation enthält sog.
My Computer packages, in denen bestimmte
Funktionen enthalten sind.
packages müssen erst geladen
werden, bevor die in ihnen enthaltenen
Funktionen benutzt werden können.
R-Base installation Einige packages werden automatisch
basic packages geladen, andere müssen nach Bedarf
geladen werden.
> library(package.name)
95. packages installieren
CRAN server
>3000 additional on
de
packages man
d My Computer
Installation per Kommandozeile
> install.packages("package.name")
R-Base installation
oder per R-Konsolenmenü basic packages
99. Code 42 : attach data
# Objekte/Datensätze in den Suchpfad hängen
y1! ! ! ! ! ! # Objekt unbekannt
attach(anscombe)! # Datensätze in den Suchpfad hängen
y1! ! ! ! ! ! # Objekt nun im Suchpfad
detach(anscombe)! # Datensatz aus Suchpfad entfernen
y1! ! ! ! ! ! # Objekt wieder unbekannt
search() # packages im Suchpfad
100. Your turn!
Lies den Datensatz wow_excerpt.csv ein und
speichere ihn in der Variablen df
Hänge df dann in den Suchpfad, so dass man auf die
Variablen ohne Angabe des Datensatzes zugreifen kann.
Entferne den Datensatz dann wieder aus dem Suchpfad.
Installiere und lade dann das psych package und
die nutze die darin enthaltene Funktion describe(),
um einen ersten Eindruck von den Daten zu
bekommen. Danach „entlade“ das package psych.
101. Datensatz wow_excerpt.csv
Geschlecht 1=keine Angabe , 2=männlich, 3=weiblich
Alter 1=keine Angabe, 2=unter 18, 3=18-29, 4=30-40, 5=41-50 , 6=über 50
1=keine Angabe, 2=weniger als 7 Stunden, 3=weniger als 14 Stunden
Zeitaufwand (pro Woche) 4=weniger als 20 Stunden, 5=20-30 Stunden, 6=30-40 Stunden, 7=mehr
als 40 Stunden
K1 Kontrollverlust: Ich sage mir oft: „Nur noch ein paar Minuten“ und kann
dann doch nicht aufhören
K2
K3
K4
Entzugserscheinungen: Ich beschäftige mich auch während der Zeit, in
E1
der ich nicht WoW spiele, gedanklich sehr viel mit dem Spiel.
E2
E3
E4
T1 Toleranzentwicklung: Mittlerweile verbringe ich mehr Zeit bei WoW als
zu Beginn meiner Online- Aktivitäten.
T2
T3
T4
AL1 Arbeit/Leistung: Meine Leistungen in der Schule/im Beruf leiden unter
dem Spielen bei WoW.
Al2
AL3
Al4
nKsB1 Soziale Beziehungen: Seitdem ich WoW spiele, haben sich einige
Freunde von mir zurückgezogen.
nKsB2
nKsB3
nKsB4
102. Editoren nutzen
R Editor
Mac OS Textmate Windows Tinn-R
Datei wird als .R Datei gespeichert und kann so
immer wieder genutzt werden
103. Code 43 : EDA
### Anschauen der WoW Daten ###
library(psych)! ! ! ! # library psych laden
describe(wow)! ! ! ! # Überblick über Datensatz
hist(wow[1:9])! ! ! ! # Histogramme der ersten neuen
Variablen
hist(wow[10:17])! ! ! # Histogramme
hist(wow[18:23])! ! ! # Histogramme
104. Code 44 : missings
# Gibt es keine Ahnung Antworten (wie k.A.),
# die noch nicht als Missing kodiert sind?
table(wow$Geschlecht)! ! ! ! # Häufigkeitstabelle
wow$Geschlecht[wow$Geschlecht==1] <- NA! # 1 zu NA umkodieren
table(wow$Geschlecht)
table(wow$Zeitaufwand)!
! ! ! # Häufigkeitstabelle
wow$Zeitaufwand[wow$Zeitaufwand==1] <- NA! # 1 zu NA umkodieren
table(wow$Alter)! ! ! ! ! ! ! # Häufigkeitstabelle
wow$Alter[wow$Alter==1] <- NA! ! ! ! # 1 zu NA umkodieren
105. Code 45 : Rekodieren
### Rekodieren ###
library(memisc)!! # eine Funktion unter verschiedenen
# zum Rekodieren
recode(wow$K1,! ! # rekodieren von K1
A = 1 <- 4,
B = 2 <- 3,
C = 3 <- 2,
D = 4 <- 1)
109. Code 49 : Datenausgabe
### Datenausgabe ###
?write.table!! ! ! ! ! ! # zum speichern als .txt
file
write.table(d, "test.txt", sep="t")
write.csv2(d, "test.csv")!! ! # als .scv datei speichern
# an SPSS program to read it
library(foreign)
write.foreign(d, "test.txt", "test.sps", package="SPSS")
# ohne Gewähr !!!
110. Code 50 : Deskriptive Statistiken
### Deskriptive Statistiken ###
summary(wow)!! ! # summaries der Variablen
attach(wow)
library(psych)! ! ! # psych laden
describe(wow)! ! ! # Basisstatisiken der Variablen
describe.by(wow[4:11], Geschlecht)! !
# Basisstatisiken pro Faktorstufe von Geschlecht
describe.by(wow[4:11], list(Geschlecht, meanSplitKO))
# Basisstatisiken pro Faktorstufe von Geschlecht
# und meanSplitKO
detach(wow)
111. Your turn!
Lies den Datensatz wow_excerpt.csv ein und
durchlaufe die Schritte:
a) missings Na setzen
b) Faktoren in Faktoren verwandeln und bennenen
c) Skala berechnen
d) eine Variable (0,1) anlegen, die KO am mean splittet
e) einen Gesamtwert berechnen über die fünf Skalen
namens „score“, der der Durchschnitt der Skalen KO,
EN, TO, AL, NK ist.
112. Code 51 : crosstabs
### Häufigkeiten ###
# One Way Table
attach(wow)
table(Alter)!! # Häufigkeitstabelle von Alter
u <- subset(wow, meanSplitKO==1, select=Geschlecht)
# nur KO größer als mean
table(u)! ! ! # Häufigkeitstabelle!
# Two Way Table
mytable <- table(Geschlecht, Alter)! # Häufigkeitstabelle
mytable
ftable(mytable)!! ! ! # ftable zur schöneren Darstellung
prop.table(mytable) ! ! # Zellen Prozente
prop.table(mytable, 1) ! ! # Zeilen Prozente
prop.table(mytable, 2) ! ! # Spalten Prozente
113. Code 52 : crosstabs
# Three Way Tables
mt <- table(Geschlecht, Alter, meanSplitKO)
ftable(mt)
# Tables mit CrossTable
library(gmodels)
CrossTable(Geschlecht, Alter)
CrossTable(Geschlecht, Alter, format="SPSS")
114. Your turn!
Mache folgende Häufigkeitstabellen für den wow
Datensatz mit CrossTable:
1) Alter gegen Zeitaufwand
2) Geschlecht gegen Zeitaufwand
115. Code 53 : Formulas
### Formulas in R ###
Dienen der Beschreibung von statistischen Modellen
Sind wie kleine eigene Sprache
y ~ model!
Dabei trennt die Tilde1 ("~") die auf der linken Seite
angegebene Zielvariable (abhängige Variable, response) von
dem auf der rechten Seite angegebenen Rest des Modells
(model).
# Operatoren der Formelsprache
+! Hinzunahme einer Variablen
-! Herausnahme einer Variablen (-1 für Achsenabschnitt)
:! Wechselwirkung/Interaktion von Variablen
*! Hinzunahme von Variablen und deren Wechselwirkungen
.! alle Variablen aus dem Datensatz in das Modell aufnehmen
116. Code 54 : Formulas
y ~ x1 ! ! ! # Modell mit einem Regressor
y ~ x1 + x2 # zwei Regressoren, keine Interaktion
y ~ x1 + x2 + x1:x2 ! # zwei Regressoren plus Interaktion
y ~ x1 * x2! ! ! ! # identisch
121. Your turn!
Nutze den Datensatz InsectSprays. Dieser enthält
Zählungen von Insekten bei der Nutzung
verschiedener Insektensprays.
Schaue, ob sich count über die Faktorstufen von sprays
unterscheiden.
Mache einen plot der Mittelwerte und als post-hoc Test
einen Tukey-Test sowie paarweise t-Tests mit
Bonferroni Korrektur.
126. Graphic Systems
R Graphic Systems
base graphics grid graphics
lattice ggplot2
various
packages
many graphic
function
127. Code 60 : Datensätze
### Daten zum ausprobieren ###
# Viele Datensätze sind bereits in R vorhanden
data()!
! ! ! # zeigt an welche Datensätze existieren
anorexia! ! ! # Daten anorektischer Patienten aus
# package MASS
insectsprays!! # package datasets
# Es kann auch das package datasets installiert
# werden, in dem viele Datensätze inkl.
# Beschreibung hinterlegt sind
install.packages("datasets")!! # installieren
library(datasets)! ! ! ! ! # laden des Pakets
130. Code 63 : Grafiken III
?coplot! ! ! ! ! ! # condition plot
coplot(lat ~ long | depth, data = quakes)
coplot(lat ~ long | depth * mag, data = quakes)
?dotchart!! ! ! !
dotchart(VADeaths)
?stripchart! ! !
stripchart(decrease ~ treatment, data = OrchardSprays)
stripchart(score ~ Zeitaufwand, data = wow)
131. Your turn!
Erzeuge einen conditioned plot (coplot) von score (y-
Achse) gegen KO(x-Achse) konditioniert mit dem
Faktor Zeitaufwand.
Mache dann einen weiteren Plot mit den beiden
konditionalen Faktoren Zeitaufwand und Geschlecht.
132. Your turn!
Erzeuge einen dotchart und ein barplot auf dem jeweils
Geschlecht gegen Alter zu sehen ist. Nutze hierzu die
table() Funktion zur Vorbereitung der Daten.
133. Code 64 : Grafikoptionen ändern I
#### Grafikoptionen verändern ###
# Jede Funktion hat viele Parameter, die verändert
# werden können
attach(wow)
plot(KO, score)
plot(KO, score, xlab="Kontrollverlust", ylab="Suchtscore")
plot(KO, score, main="Kontrollverlust vs. Sucht",
! xlab="Kontrollverlust", ylab="Suchtscore")
plot(KO, score, col=3)
plot(KO, score, col=3, pch=15)
plot(KO, score, col=3, pch=15, cex=.5)
plot(KO, score, col=3, pch=15, cex=.5)
136. Your turn!
Erzeuge folgendes barchart mit der Funktion barplot()
Altersverteilung
unter 18
18−29
30−40
41−50
über 50
w
Geschlecht
m
0 50 100 150 200 250 300
Anzahl an Personen
137. Code 67 : base graphics I
### Einführung ins base Grafik System ###
# grafische Basiselemente
?plot! ! ! ! ! ! ! # welche Optionen gibt es?
! ! ! ! !
set.seed(5)! ! ! ! ! ! # Ausgangspunkt für Zufallszahl
iq <- rnorm(30, 100, 15)! !
pisa <- x*.5+10 + rnorm(30,0,1) # pisa aus iq plus Zufall
plot(iq, pisa)! ! ! ! # plotten von x gegen y
plot(iq, pisa, pch=2)! ! ! # Ändern des Characters
plot(iq, pisa, pch=3)! ! ! # Ändern des Characters
plot(iq, pisa, type="h")! ! # Änderung des type Arguments
138. Code 68 : base graphics II
?lines
plot(iq, pisa)! ! ! # plotten von x gegen y
lines(x=c(60,130), y=c(40,80))!
# Linie von P(60,40) nach P(130,80)
lines(x=c(60,130), y=c(40,80), col=3)
# andere Farbe
! ! !
# die par() (Parameter) Einstellungen
lines(x=c(60,130), y=c(40,80), col=3, lty=3, lwd=2)
139. Code 69 : base graphics III
?abline
plot(iq, pisa, col="brown", pch=16)!
!
# plotten von x gegen y
abline(v=mean(iq), col="grey", lty=2)!
! # vertikale Linine bei MW IQ
abline(h=mean(pisa), col="grey", lty=2)!
! # hor. Linie bei MW pisa
abline(v=c(90, 110), col="blue", lty=3)! !
! vert Linie bei x=90 und x=110
#
abline(lm(pisa ~ iq))!
!
! ! ! ! ! # Regressionslinie pisa ~ iq
140. Your turn!
Erzeuge einen plot mit dem WoW Daten. Plotte AL gegen score in der
Farbe blau. Benenne die Achsen und gib der Grafik eine Überschrift.
Zeiche dann eine gestrichelte vertikale Linie beim Mittelwert von Al und
eine horizontale beim Mittelwert von score ein. Füge zuletzt eine
Regressionsgerade in rot hinzu.
Übung
●
●
3.5
●
●
● ●
● ● ●
3.0
●
●
● ●
● ●
● ●
●
● ●
● ● ●
2.5
Suchtscore
● ● ● ●
●
● ● ● ● ● ●
● ● ●
● ● ●
● ● ● ● ●
● ● ● ●
● ● ● ● ● ●
● ● ● ● ●
● ● ● ● ● ●
2.0
● ● ● ● ● ● ● ●
● ● ● ●
● ● ● ● ● ●
● ● ●
● ● ● ● ● ● ●
● ● ● ●
● ● ● ● ●
● ● ● ● ● ●
● ● ● ●
● ● ● ●
1.5
● ● ● ● ●
● ● ●
● ●
● ● ● ●
● ● ● ●
● ● ●
● ●
● ●
●
●
1.0
●
1.0 1.5 2.0 2.5 3.0 3.5 4.0
negative Konsequenzen
141. Code 70 : base graphics IV
?points
plot(iq, pisa, type="n")! ! ! # plotten ohne Punkte
points(iq, pisa)! ! ! ! ! # Punkte hinzufügen
?text! ! ! ! ! ! ! ! ! # um Text hinzuzufügen
text(72,78, "test text", col="blue")!
# Text an Position (72,78)
?mtext!
! ! ! ! ! ! ! ! # für margin text
mtext(side=3, "test mtext", col="red")!
# margin text oben
148. Code 73 : plot from scratch II
abline(lm(pisa ~ iq), lty=2)!! ! # Regressionslinie
title(main="Pisa Ergebnisse geschätzt durch den IQ")
# Titel
mtext(side=1, "IQ Werte", line=-.5, at=135,
! adj=0, cex=.8, col="darkgrey") # Text 1. Achse
mtext(side=1, "z-Werte", line=2.0, at=135, ! ! !
adj=0, cex=.8, col="darkgrey") # Text 2. Achse
mtext(side=1, "T-Werte", line=4.5, at=135, ! ! !
adj=0, cex=.8, col="darkgrey") # Text 3. Achse
par(oldPar) # Parameter settigs wiederherstellen
149. Code 73 : Grafik als Datei
### Grafik-Output in Datei erzeugen ###
jpeg()!! # öffnet einen jpeg device
bmp()! ! # öffnet einen bmp device
pdf()! ! # öffnet einen pdf device
png()! ! # öffnet einen png device
pdf()! ! # pdf device öffnen
plot(1:10)
dev.off()! device schließen
#
dev.list()! # welche devices sind noch offen?
150. Your turn!
Übung in eine .pdf Datei aus. Da der Code noch existiert kann
der plot ja schnell wiederhergestellt werden :)
151. Your turn!
Drucke alle pch Symbole von 1 bis 25 mit plot() in einem Raster. Jedes Symbol soll eine
verschiedene Farbe haben. Erstelle eine Überschrift. Es sollte in etwa so aussehen:
pch Symbole von 1 bis 25
5 ●
● ● ●
4
●
3
y
●
2
●
1
1 2 3 4 5
x
152. Code 74 : R Commander
############# R Commander ################
library(Rcmdr)
Commander()
156. Your turn!
Erzeuge folgende Ausgabe in der Konsole, indem
Du paste() und die Konstante month.name nutzt.
> paste(month.name, "is month number", 1:12)
"January is month number 1" "February is month number 2"
"March is month number 3" "April is month number 4"
"May is month number 5" "June is month number 6"
"July is month number 7" "August is month number 8"
"September is month number 9" "October is month number 10"
"November is month number 11" "December is month number
12"
157. Your turn!
Du hast folgenden Vektor: v <- c(1,2,3,4,5).
Erzeuge folgende Ausgabe in der Konsole:
Der Vektor v hat die Länge 5
Er besteht aus folgenden Elementen: 1 2 3 4 5
Tip: Benutze hierzu die Funktion cat() und length() und
kombiniere Variablen und Text.
> cat("Der Vektor v hat die Länge", length
(v), "nEr besteht aus folgenden Elementen",
v)
158. Your turn!
Erzeuge folgende Ausgabe in der Konsole, indem
Du cat(), paste() und die Konstant month.name nutzt.
> cat(paste(month.name, "is month number", 1:12, "n"), sep="")
January is month number 1
February is month number 2
March is month number 3
April is month number 4
May is month number 5
June is month number 6
July is month number 7
August is month number 8
September is month number 9
October is month number 10
November is month number 11
December is month number 12
Die Ausgabe soll nun pro Zeile erfolgen
159. Your turn!
Berechne die geschätzte Kovarianz für folgende
zwei Datenreihen in R „zu Fuß“
x <- c(-2,-1,-1,0,1,1,2)
y <- c(-1,-2,1,0,2,-1,1)
> sum((x-mean(x))*(y-mean(y)))/6
> cov(x,y) ! ! # zur Kontrolle
160. Your turn!
Lege ein Verzeichnis RCourse an und setze es als neues
Arbeitsverzeichnis. Lege eine Unterordner data an und wechsele in
ihn. Wechsel anschließend wieder in den übergeordneten Ordner.
setwd("users/mark/RCourse")
setwd("data")
setwd("..")
161. Your turn!
Berechne die Korrelation für folgende zwei Datenreihen in R „zu
Fuß“. Konstruiere die Lösung so, dass man x und y (gleich lang)
austauschen kann, ohne den Code sonst zu verändern.
x <- c(-2,-1,-1,0,1,1,2)
y <- c(-1,-2,1,0,2,-1,1)
> kovarianz <- sum((x-mean(x))*(y-mean(y)))/(length(x)-1)
> kovarianz/(sd(x)*sd(y))
> cor(x,y) ! ! # zur Kontrolle
162. Quiz 1 !
Welche Regeln gibt es für die Benennung von Objekten?
(s. Folie Objektbezeichnungen)
Welche Regeln gibt es für leserlichen Code?
Welche Objektnamen sind erlaubt?
a1234 JA
ausdruck JA
Variable JA
.Variable JA
Variable. JA
_Variable NEIN
Variable_ JA
1teVariable NEIN
.1Variable NEIN
Überlege was folgende Ausdrücke ergeben:
11 %% 5
1:6 %% 2
11 %/% 5
10:19 %/% 5
164. Quiz 3 !
Überlege was folgende Ausdrücke ergeben:
1:5 > 2
c(-1,2,3,5) == min(c(-1,2,3,5))
6 + 1:4
6:1 - 3:1
3*FALSE - TRUE*5
c(T,F,T,F,T) == 1
c(T,F,T,F,T) == FALSE
x <- c(1,5,2,0,6,2,9)
Suche die Stelle des Vektors x raus, der zu der niedrigsten
Zahl sowie zu der höchste Zahl gehört. Ordne die beiden
Werte dann in einem Vektor an.
> c(which.min(x), which.max(x))
165. Quiz 4 !
Überlege was folgende Ausdrücke ergeben:
seq(10, 1, -1)
seq(10, 1, 1)
rep(1:3, times=3:1)
rep(rep(1:2, t=1:2), t=1:3)
rep(1:3, l=5)
LETTERS[2:4]
Erzeuge folgende Vektoren:
> letters[seq(1,26,2)] # oder alternativ
> letters[c(T,F)]
[1] "a" "c" "e" "g" "i" "k" "m" "o" "q" "s" "u" "w" "y"
[1] "B=2" "D=4" "F=6" "H=8" "J=10"
Erzeuge einen Vektoren mit NV Zufallszahlen der Länge 10 und runde ihn auf eine
Dezimalstelle.
> round(rnorm(10),1)
166. Your Turn!
Oftmals wird 99 oder 999 als Platzhalter für missing values
benutzt. Ersetze alle Werte des Vektors, die 99 oder 999
sind mit NA.
x <- c(1,4,3,99,4,3,999,99,3,6,999)
> x[x==99 | x==999] <- NA
> x
[1] 1 4 3 NA 4 3 NA NA 3 6 NA
167. Your Turn!
v <- 1:10
Setze alle Elemente des Vektors v, die kleiner gleich 3 sind
auf 0, alle die zwischen 4 und 7 sind auf 1 und alle größer
sieben auf NA.
[1] 0 0 0 1 1 1 1 NA NA NA
> v[v<=3] <- 0
> v[v>=4 & v<=7] <- 1
> v[v>7] <- NA
> v
[1] 0 0 0 1 1 1 1 NA NA NA
168. Your Turn!
Erzeuge eine Matrix M mit 20 Spalten und den folgenden Zeileneinträgen:
Zeile 1: 1, 2, ..., 20
Zeile 2: Zahlen zwischen 2 und 40 mit Abstand 2
Zeile 3: Spalte 1-10 mit Eintrag 1, Spalte 11-20 mit Eintrag 2
Zeile 4: 1,1,2,2,1,1,2,2,...
Zeile 5: 1,1,2,2,3,3,4,4,4,4,5,5,5,5,6,6,6,6,6,6
Zeile 6: 1,2,2,2,3,3,3,3,3,3,1,2,2,2,3,3,3,3,3,3
> z1 <- 1:20
> z2 <- seq(2,40,2)
> z3 <- rep(1:2, e=10)
> z4 <- rep(1:2, e=2, t=5)
> z5 <- rep(1:6, c(2,2,2,4,4,6))
> z6 <- rep(rep(1:3, c(1,3,6)), 2)
> m <- matrix(c(z1, z2, z3, z4, z5, z6), ncol=20, byrow=T)
> m
Quelle: Foliensatz von Peter Ruckdeschel / Matthias Kohl. R/S-plus für Einsteiger und Fortgeschrittene
170. Your Turn!
1) Erzeuge eine Matrix M mit 7 Spalten und 7 Zeilen aus
zufälligen NV-Werten, die auf eine Stelle gerundet werden.
2) Folgende Zellen sollen nun durch 999 ersetzt werden:
(1,1) (4,3) (4,4) (1,7)
3) Alle Einträge die 999 enthalten sollen NA gesetzt werden.
M <- matrix(round(rnorm(7*7),1), ncol=7)
M[1,1] <- 999
M[4,3] <- 999
M[4,4] <- 999
M[1,7] <- 999
M[M==999] <- NA
171. Your turn!
Berechne die Matrix b der Regression y
regridiert auf x in Matrizenform
x <- c(-2,-1,-1,0,1,1,2)
y <- c(-1,-2,1,0,2,-1,1)
Beachte: die Designmatrix X enthält
eine Spalte mit Einsen für die Konstante!
X <- cbind(rep(1,7), x)! ! # Design Matrix erstellen
Y <- y
solve(t(X)%*% X)%*%t(X)%*%Y # Berechnung
lm(y~x) # zur Kontrolle
172. Your turn!
Erzeuge einen factor der folgenden Form:
> f <- factor(rep(4:1, 4:1))
> levels(f) <- paste("Gruppe", 1:4)
[1] Gruppe 4 Gruppe 4 Gruppe 4 Gruppe 4
Gruppe 3 Gruppe 3 Gruppe 3 Gruppe 2 Gruppe 2
Gruppe 1
Levels: Gruppe 1 Gruppe 2 Gruppe 3 Gruppe 4
173. Your turn!
Erstelle eine Liste l, bei der: a) das erste Element ein Vektor der
Großbuchstaben A bis M ist b) das zweite Element die Zeichenkette
"Ich bin das zweite Element" c) das dritte Element eine Matrix (5x5) mit
zufälligen Werten mit 1 Dezimalkommastelle enthält.
> e1 <- LETTERS[1:13]
> e2 <- "Ich bin das zweite Element"
> e3 <- matrix(round(rnorm(5*5),1), ncol=5)
> l <- list(e1,e2,e3)
> l
[[1]]
[1] "A" "B" "C" "D" "E" "F" "G" "H" "I" "J" "K" "L" "M"
[[2]]
[1] "Ich bin das zweite Element"
[[3]]
[,1] [,2] [,3] [,4] [,5]
[1,] 0.9 0.3 0.5 0.6 2.4
[2,] -0.9 -0.7 1.5 -1.1 -1.2
[3,] -1.2 0.9 0.4 -1.7 0.2
[4,] -0.4 -0.1 0.2 0.0 0.8
[5,] 1.3 -1.1 -0.7 0.0 1.1
174. Your turn!
Füge nun noch folgende Namen zu den Listenelementen hinzu:
Buchstaben, Text, Matrix.
Dann ändere alle Einträge der Matrix, die kleiner als 0 sind, in NAs um, kürze
den Vektor Buchstaben auf A bis F und kehre die Reihenfolge der letzten beiden
Listenelemente um.
> names(l) <- c("Buchstaben", "Text", "Matrix")
> l$Matrix[l$Matrix < 0] <- NA
> l$Buchstaben <- l$Buchstaben[1:6]
> l <- l[c(1,3,2)]
> l
$Buchstaben
[1] "A" "B" "C" "D" "E" "F"
$Matrix
[,1] [,2] [,3] [,4] [,5]
[1,] 0.7 0.5 NA 0.8 0.7
[2,] NA 0.9 NA NA 1.5
[3,] NA 1.3 1.3 NA NA
[4,] 0.7 NA 1.1 NA 0.0
[5,] NA 1.1 NA NA 1.6
$Text
[1] "Ich bin das zweite Element"
175. Your turn!
konstruiere folgenden data frame:
(IQ normalverteilt um 100 mit sd=15; BMI normalverteilt um 20, sd=5)
Geschlecht Intervention IQ BMI
1 m Control 94.8 22.5
2 m Treat 113.1 19.6
3 m Placebo 107.1 24.3
4 m Control 108.8 9.2
5 m Treat 102.4 24.5
6 m Placebo 104.8 23.0
7 m Control 90.6 17.9
...
> f1 <- factor(rep(c("m", "w"), each=10))
> f2 <- factor(rep(c("Control", "Treat", "Placebo"), l=20))
> r1 <- round(rnorm(20)*15+100, 1)
> r2 <- round(rnorm(20, mean=20, sd=5), 1)
> d <- data.frame(Geschlecht=f1, Intervention=f2, IQ=r1, BMI=r2)
> d
176. Quiz 1 !
Kehre die Elemente des folgenden Vektors um
v <- rep(1:3, 3:1)
v[6:1]
[1] 1 1 1 2 2 3
Schreibe dann eine Befehlsfolge, die die Reihenfolge der
Elemente eines beliebigen Vektors umkehrt, also auch
funktioniert, wenn der Vektor ein anderer ist
v[length(v):1] # oder auch: rev(v)
Erzeuge folgenden data frame mit beliebigen Werten
IQ schulnote
1 95.9 3
2 83.0 2
3 104.7 4
...
> d1 <- data.frame(IQ=round(rnorm(10), 1),
! schulnote=round(rnorm(10), 1))
> d1
177. Quiz 2 !
Ändere folgende Zellen des data frame in NA: (1,1) (5,2)
d1[1,1] <- NA
d1[5,2] <- NA
Füge eine Spalte an, in dem sich 0 und 1 abwechseln an den data
frame an und gib ihr den Namen "dummy"
d1 <- cbind(d1, dummy=0:1)
Erzeuge eine Liste, die den data frame als ersten Eintrag enthält
l1 <- list(d1)
Ändere nun die Zelle (2,2) des data frames (erstes Listenelement)
in der Liste auf NA
l1[[1]][2,2] <- NA
178. Your turn!
baue den vorher erzeugten Datensatz um: a) erst die
ungeraden, dann die geraden Zeilen kommen b) neue Spaltenreihenfolge
IQ BMI Geschlecht Intervention
1 109.9 18.9 m Control
3 101.2 18.7 m Placebo
5 111.4 14.7 m Treat
7 104.6 17.3 m Control
9 103.7 24.9 m Placebo
11 97.1 16.0 w Treat
...
> d[c(seq(1,19,2), seq(2,20,2)), c(3,4,1,2)]! ! !
> # oder auch
> rbind(d[c(T,F),c(3,4,1,2)],
d[c(F,T),c(3,4,1,2)])
179. Your turn!
Wähle aus dem Datensatz alle Fälle aus, die weiblich sind
und zur Treatmentgruppe gehören
Geschlecht Intervention IQ BMI
11 w Treat 123.8 21.5
14 w Treat 96.3 28.5
17 w Treat 104.3 20.4
20 w Treat 94.8 14.5
> d[d$Intervention == "Treat" & d$Geschlecht=="w" ,]
180. Your turn!
Wähle aus dem data frame jene Fälle aus, die einen IQ innerhalb des
Bereichs 90-110 haben und zugleich Männer sind
Geschlecht Intervention IQ BMI
1 m Control 109.9 18.9
2 m Treat 109.1 18.7
4 m Control 110.1 18.0
5 m Treat 111.4 14.7
6 m Placebo 110.3 22.2
8 m Treat 123.5 23.2
10 m Control 107.6 17.8
> d[d$IQ > 90 & d$IQ < 110 & d$Geschlecht=="m" ,]
181. Your turn!
Wähle aus dem Datensatz mit subset alle Fälle aus, die einen IQ
größer als der Durchschnitt haben, der berechnet wird.
Geschlecht Intervention IQ BMI
1 m Control 102.5 16.7
2 m Treat 102.3 18.9
3 m Placebo 101.8 18.2
5 m Treat 106.7 21.0
10 m Control 118.9 15.7
11 w Treat 123.8 21.5
12 w Placebo 104.8 24.4
...
> subset(d, IQ > mean(IQ))