---
title: "Übung 1 - Einführung in R"
author: "Jonathan Harrington / Ulrich Reubold"
date: "April 2019"
output: html_document
---

```{r setup, include=FALSE}
knitr::opts_chunk$set(echo = TRUE)
```

## 0 Allgemein
### 0.01 RStudio starten, RStudio (und damit R) beenden
Wenn man RStudio startet, beginnt man einen R-Session. Man beendet einen R-Session mit

```{r eval=FALSE, echo=T, warnings=T, message=T}
q()
```

Vorsicht! Entweder schließt sich RStudio, ohne zu fragen (wenn nichts im sogenannten workspace ist), oder
die Frage "Save workspace image to ~/.RData? [y/n/c]: " mit "n" beantworten.
Einfacher:
RStudio über das gewöhnliche Symbol zum schließen eines Programms beenden. Auch dann werden Sie gefragt, 
ob ein "Workspace image" gespeichert werden soll oder nicht (meistens wollen Sie das NICHT, denn dieses Image wird bei jedem Start von RStudio/R! geladen.)

### 0.02	Verzeichnis erzeugen für den Import/Export von Daten
Wir werden im Laufe des Semesters öfters Daten in R importieren und von R exportieren müssen. Erzeugen Sie dafür ein Verzeichnis auf Ihrer Festplatte und geben Sie den Pfad von diesem Verzeichnis in " " ein in R. 
```{r}
# z.B. den Ordner "R" in "/Users/reubold/Documents/" anlegen, und dann
pfad = "/Users/reubold/Documents/R"
```
Vergewissern Sie sich, dass dieses Objekt mit dem erwünschten Pfad existiert (aber nicht, dass der angegebene Pfad stimmt):

```{r}
ls()
pfad
```

So bestätigen Sie, dass das Verzeichnis auf Ihrer Festplatte tatsächlich existiert (die Antwort muss `TRUE` sein):
```{r}
dir.exists(pfad)
```

Dies gilt nur, wenn es um einen lokalen Ordner geht.
Man kann auch "Pfade" angeben, die in Wirklichkeit 
eine Webadresse in Form einer
URLs (Uniform Resource Locator) sind.

Wir werden öfters sogenannte 'Data-Frames' aus einer Webseite
(Tabellen als Textdateien) laden. Hier wird
der Pfad dieser Webseite festgelegt:

```{r}
pfadu = "http://www.phonetik.uni-muenchen.de/~jmh/lehre/Rdf"
```

Jetzt RStudio beenden: antworten Sie nur dieses eine Mal 'Save' auf die Frage 'Save workspace image to ~/.RData?'. 
Dies soll das einzige Mal sein, in dem diese Frage mit 'Save' beantwortet 
wird: sonst in Zukunft immer 'Don't Save'.

Nun RStudio bitte wieder starten, und verifizieren, dass "pfad" und "pfadu" existieren:

```{r}
ls()
```

Ab jetzt können wir Dateien aus pfad bzw. pfadu einlesen, z.B.:

```{r}
read.table(file.path(pfadu, "ai.txt"))
```

Zur Erläuterung:

```{r}
file.path(pfadu, "ai.txt") #erzeugt einen neuen Pfad, indem an den alten 'pfadu' ein '/' und "ai.txt" angehängt wird

```
`read.table()` liest eine Textdatei in Form einer Tabelle als data.frame ein.

#### In RStudio
Anstelle von Befehlen wie `ls()`, `read.table()` usw. können Sie auch RStudio nutzen: in einem Ihrer Panels finden Sie 'Environment'; dort sind alle Objekte aufgelistet, so wie sie in `R` (d.h. in der Console von RStudio) durch `ls()` aufgelistet werden. Unter Environment finden Sie auch Buttons zum öffnen, importieren, und speichern von Daten. Sie können dort auch Objekte löschen (Besensymbol). Um einzelne Objekte zu löschen, müssen Sie unter Environment rechts oben den Punkt 'list' zu 'grid' ändern, dann sehen Sie die Objektliste mit checkboxes angezeigt. Markieren Sie die gewünschten Objekte, und führen Sie anschließend die gewünschte Aktion (z.B. löschen, speicher etc.) durch!

### 0.03 Objekte in R erzeugen und listen
Ein neues Objekt wird mit '=' (assign) oder '<-' erzeugt.

```{r}
# Es gibt numerische Objekte
x = 3
y <- 4
ls()

# Und auch Schriftzeichen-Objekte in ""
z = "etwas"
```

Wenn Sie den Inhalt des Objektes sehen wollen, können Sie einfach den Objekt-Namen eingeben:

```{r}
x
```

Neue Objekte mit dem selben Inhalt erzeugen Sie mit:

```{r}
x = y = z = 4
```

Objekte werden in R einfach überschrieben, und zwar (oftmals leider) ohne Warnmeldung:

```{r}
y = 4
y
y ="Phonetik"
y
```
### 0.04 Objekte in R permanent speichern
Objekte werden am besten mit `save()` gespeichert. Hier ist "etwas" irgendein beliebiger Name. Wir brauchen keine Dateiendung. Wenn wir aber wollen,
das die erzeugte Datei später per Doppelclick in R geladen werden kann,
sollten wir die Dateiendung ".RData" hinzufügen.

Alles, was gespeichert werden soll, muss unter "list" angegeben werden
- im vorliegenden Fall ist das einfach alles.
Der Befehl tut also das gleiche, als würden wir R schließen, und
auf die Frage "Save workspace image to ~/.RData? [y/n/c]: " mit "y" antworten:

```{r}
save(list = ls(), file = file.path(pfad, "etwas.RData"))
save(list = ls(), file = file.path(pfad, "etwas"))
```

Dann `q()` (oder einfach RStudio schließen) und (immer) mit `n` beantworten - siehe 0.02.

Einfacher geht das wieder in RStudio selbst: einfach unter environment auf das Diskettensymbol clicken.

### 0.05 Objekte wieder einlesen mit `attach()` bzw. `load()`
RStudio/R starten und dann:

```{r}
attach(file.path(pfad, "etwas"))
```

Hier ist "etwas" der Name in '0.04' oben. Dann sind die Objekte wieder da...
```{r}
x
y
```
Allerdings sehen wir sie nicht aufgelistet, wenn wir
```{r}
ls()
```
eingeben.

Alle in einer R-Session 'attach'-ten Objektlisten und Libraries ("packages", dazu später mehr) sind durch `search()` vorhanden:

```{r}
search()
```
Hier sehen wir, dass unser Obkektliste (mit "pfad","pfadu","x","y","z") an zweiter Stelle ist. 

Jeder Library, aber auch Objektliste kann mit 'detach()' wieder entfernt werden. 
```{r}
detach(2)
search()
```

Die Objekte sind daher nicht mehr vorhanden:

```{r,eval=FALSE}
x
# Error: object 'x' not found
```

Alternative: `load()`: entweder doppelclicken auf "etwas.RData"" oder:

```{r}
load(file.path(pfad, "etwas.RData"))
ls()
```

Sollten wir nun tatsächlich x, y, und z wieder loswerden wollen, müssen wir diese allerdings löschen mit `rm()`:

```{r}
rm(list=c("x","y","z"))
ls()
```

Übrigens: sollten Sie alles in Ihrem workspace löschen wollen: 

`rm(list=ls())`

All dies geht in RStudio unter Environment viel einfacher (wie oben erwähnt).
Der Nachteil ist allerdings, dass Sie dieses Vorgehen in RStudio NICHT automatisieren können, während Sie die genannten Befehle nützen können, um diese in R-Skripte zu speichern, und auf diese Weise mehreren Usern, z.B. den Teilnehmern dieses Kurses, zukommen zu lassen. So werden wir z.B. in diesem Kurs sehr oft Dateien aus der Website `pfadu` öffnen. Das geht mit `read.table(file.path(pfadu,"Dateiname"))` viel schneller als wenn wir schreiben würden: 
"Öffnen Sie einen Browser und laden von folgender Website (dann folgt die Adresse) folgende Datei (deren Name dann folgt) herunter und speichern diese an einem Ort Ihrer Wahl. Öffnen Sie über Environment diese Datei." usw. ...

Außerdem brauchen Sie die oben genannten Befehle ohnehin, wenn Sie `R` z.B. hier auf dem Server starten, um aufwendigere Berechnungen durchzuführen, die Ihren Laptop überlasten würden.

### 0.06 Libraries (packages)
Wie wir gelernt haben, gibt es Funktionen in R. Diese schauen immer so aus:

```{r,error=TRUE}
x()
```

Für viele Spezialanwendungen, die durch das "normale" R nicht abgedeckt sind
gibt es 'packages', die Funktionen enthalten.

Nächste Stunde werden wir z.B. das package "ggplot2" kennenlernen. Dieses enthält u.a. die Funktion `geom_boxplot()`, aber:

```{r,error=TRUE}
geom_boxplot()
```

Wenn wir meinen, diese Funktion zu benötigen, müssen wir das package, das diese Funktion enthält,
laden. Dazu müssen wir das package allerdings einmal installieren:

In RStudio:

**Tools-->Install Packages**

oder:

```{r,eval=FALSE}
install.packages("ggplot2")
```
Das eigentliche Laden des packages geht über:
```{r}
library(ggplot2)
geom_boxplot() #ist nun vorhanden
```

Auch hier können wieder `search()` und `detach()` eingesetzt werden, um die Funktionen wieder aus dem Suchraum von R zu entfernen...

```{r,error=TRUE}
search()
detach(2)
geom_boxplot()
```

...und die Funktion (und alle anderen Funktionen aus `ggplot2`) ist/sind wieder weg.

### 0.07 Hilfeseiten
Für eine Einführung in R: 'An Introduction to R' in:
```{r,eval=FALSE}
help.start()
```
Wenn Sie mehr über eine bestimmte Funktion wissen wollen, z.B. über `pnorm()`:
```{r,eval=FALSE}
help(pnorm)
# oder
?pnorm

example(density)

apropos("spline")

help.search("norm")
```

Allerdings: oftmals ist eine Suche über z.B. Google der schnellere und umfassendere Weg, da es so viele Benutzer von R und damit viele entsprechende Foren gibt.

Einen Überblick der vorhandene, allgemeingebräuchliche R-Funktionen bietet http://cran.r-project.org/doc/contrib/Short-refcard.pdf.

### 0.08 Data-Frames einlesen

Ein Data-Frame ist eine Art Matrix mit verschiedenen Reihen und Spalten, die wir für die statistische Analyse sehr oft verwenden werden. 

Die Data-Frames können so eingelesen werden (angenommen '0.02' wurde durchgeführt):

```{r}
ai.df  = read.table(file.path(pfadu, "ai.txt"))
head(ai.df)
vlax.df = read.table(file.path(pfadu, "vlax.txt"))
```
Durch die Klammer um den gesamten Befehl erzeugen Sie hier nicht nur vlax.df,
sondern bekommen dessen Inhalt gleich angezeigt.
```{r,eval=FALSE}
(vlax.df = read.table(file.path(pfadu, "vlax.txt")))
```

Sie speichern den Data-Frame als eine Text-Datei durch:
```{r}
write.table(vlax.df, file.path(pfad, "v.txt"))
# besser: damit keine "" erscheinen
write.table(vlax.df, file.path(pfad, "v.txt"), quote=FALSE)
```

### 0.09 Data-Frames selber aufbauen und erzeugen
Oftmals werden wir die Notwendigkeit haben, uns einen data.frame selbt zusammenzubauen. Ein Beispiel hierfür ist:
```{r}
# 10 Etikettierungen, 5 /i/, 5 /o/
v.l = c("i", "i", "i", "i", "i", "o", "o", "o", "o", "o")
# oder
v.l = c(rep("i", 5), rep("o", 5))
# oder
v.l = rep(c("i","o"),each=5)

f1 = c(240, 220, 250, 210, 280, 520, 510, 605, 670, 613)
vok.df = data.frame(f1, factor(v.l))

# mit anderen Namen
vok.df = data.frame(F1 = f1, V = v.l)
class(vok.df)
summary(vok.df)

# Data-Frame ablegen und wieder einlesen
write.table(vok.df, file.path(pfad, "vok.txt"), quote=F)
read.table(file.path(pfad, "vok.txt"))
summary(vok.df)
class(vok.df$V)
class(vok.df$F1)
```

### 0.10 Noch eine sehr nützliche Funktion: `with()`
```{r}
?with
#z.B.:
with(vok.df,F1)
# =
vok.df$F1

with(vok.df,table(V))
# = (fast, zumindest...)
table(vok.df$V)
```

### 0.11 Logische Vektoren
Mit `==` kann man fragen, ob zwei Dinge identisch sind; falls ja, wird `TRUE` ausgegeben; das `==` ist also ganz was anderes als `=` (Zuweisung; assign):

```{r}
x = 0
y = 1
# x und y sind mit sich selbst natürlich identisch
x == x
y == y
x == y
x == 0
x == 1
z = 0
x == z
```

Eine Ausnahme: wenn wir wissen wollen ob `"a"` ein Element von `c("a","b","c")`, ist, brauchen wir  `%in%` anstelle von `==`:
```{r}
"a" %in% c("a","b","c")
```


Das alles kann man zur Auswahl anwenden:
```{r}
vok.df$V

vok.df$V == "i"

with(vok.df,V == "i")
```

Wenn man vok.df nur auf die Werte aus "i"-Vokalen beschränken will:
```{r}
vok.df[vok.df$V == "i",]
# oder
vok.df[with(vok.df,V == "i"),]
```
Verbindung mehrerer logischer Vektoren mit logischem UND "&":
```{r}
# nur den "i"-Vokal mit F1 == 240
vok.df$V == "i" & vok.df$F1 == 240
# =
with(vok.df,V =="i" & F1 == 240)
```

Wenn sich Ihnen jetzt noch nicht der Vorteil von `with()` erschließen sollte: In späteren Sitzungen wird deutlicher werden, weshalb `with()` so praktisch ist; 
vielleicht aber schon in den Antworten zu **f1.R** (diese Sitzung).

### Indizieren mit logischen Vektoren:

```{r}
#Nun den logischen Vektor in den data.frame stecken, um diesen zu filtern:
#alles, wo in dem parallelen log. Vektor TRUE ist, wird ausgewählt:

vok.df[vok.df$V == "i" & vok.df$F1 == 240,]
#oder
vok.df[with(vok.df,V =="i" & F1 == 240),]

```



Die library(dplyr) macht das aber viel, viel einfacher; sie verwendet aber auch logische Vektoren:

```{r,eval=FALSE}
install.packages("dplyr")
```
```{r}
library(dplyr)
#... und zwar wird es einfacher durch den filter()-Befehl:

filter(vok.df,V=="i" & F1==240)

#... oder z.B.
filter(ai.df,F1==1005)
```

`filter()` ist eines der sogenannten "Verben" in `dplyr`. Es gibt nur eine begrenzte Anzahl:
`filter()`, `arrange()`, `select()`, `rename()`, `mutate()`,`transmute()`,`summarise()`,`sample_n()`,`sample_fraq()`

Heute besprechen wir nur das sehr nützliche "Verb" `filter()`, sowie `select()`:

```{r}
select(ai.df,1)
select(ai.df,F1)
#das Gegenteil, also der Rest des data.frames
select(ai.df,-F1)
```


`select()` greift also auf Spalten zu.

Gibt es auch einen Befehl, um spezifische Zeilen anzeigen zu lassen?

Natürlich! Aber:
Der `slice()`-Befehl wird nicht zu den Basisverben von `dplyr` gerechnet.
Dieser Befehl gibt die Zeile(n) aus, die man angibt, z.B.: 

```{r}
slice(ai.df,5:7)
```

Aber: Wie man sieht: das Ausgabeformat ist kein `data.frame` mehr, sondern ein sogenanntes `tibble`. Doch dazu später mehr...
