0. R starten, R beenden; RStudio

Wenn man R startet, beginnt man eine Session. Man beendet eine Session mit

q()

(Hier die Frage ‘Save workspace image’ mit ‘cancel’ beantworten.)

Sie sollten stattdessen RStudio benutzen. RStudio ist eine grafische Benutzeroberfläche für R. Sofern R installiert ist, öffnet RStudio R in einem “console” genannten Sub-Fenster. Außerdem gibt es ein Sub-Fenster für R-Skripte (Textdokumente, die R-Code enthalten); daneben gibt es noch zwei weitere Sub-Fenster, die u.a. für die Darstellung von von uns erstellten Abbildungen dienen (dazu später mehr).

Jede Zeile mit ‘#’ davor wird von R ignoriert. Dies dient dem Kommentieren Jede Zeile ohne ‘#’ davor kann von RStudio ausgeführt werden, wenn der Cursor in dieser Zeile ist und Sie rechts oben auf “Run” klicken, z.B.:

help()

Alternativ dazu können Sie den Code auch zu R schicken, indem Sie auf Code –> Run selected line(s) anklicken; dort sehen Sie auch den keybord-shortcut, der genau das gleiche macht (und den Sie besser auswendig lernen).

Wie Sie an dem help()-Beispiel bemerkt haben werden, können Sie in einem der Sub-Fenster nun den Hilfetext zu help() lesen. Das wird später wichtig, wenn wir uns über die Syntax eines Befehls informieren wollen.

Zunächst jedoch Grundlegendes zu R:

1. Objekte in R

Ein neues Objekt wird mit ‘=’ (assign) oder ‘<-’ erzeugt. Es gibt numerische Objekte…

x = 3
y <- 4
ls()
## [1] "x" "y"

…und auch Schriftzeichen-Objekte in "" :

z = "etwas"

Wenn Sie den Inhalt des Objektes sehen wollen, müssen Sie einfach den Objekt-Namen eingeben:

x
## [1] 3

Neue Objekte erzeugen mit dem selben Inhalt:

x = y = z = 4

Objekte werden in R gleich überschrieben ohne Warnmeldung:

y = 4
y
## [1] 4
y ="Phonetik"
y
## [1] "Phonetik"

Was ist das für ein Objekt?

class(x)
## [1] "numeric"
class(y)
## [1] "character"

2. Vektoren und Indizierung

2.1 Die c()-Funktion

Numerischer Vektor ‘x’ mit 6 Elementen:

x  = c(3, 4, 6, 89.3, 0, -10)
x
## [1]   3.0   4.0   6.0  89.3   0.0 -10.0

Schriftzeichen-Vektor mit 4 Elementen:

labs  =  c("E", "A", "E", "i:")
labs
## [1] "E"  "A"  "E"  "i:"

2.2 Indizierung

x[2]                # Element 2 von  x
## [1] 4
x[2:4]              # Elemente 2 bis  4
## [1]  4.0  6.0 89.3
x[c(1,4)]           # Elemente 1 und 4
## [1]  3.0 89.3
x[-2]               # Alle Elemente außer Element 2
## [1]   3.0   6.0  89.3   0.0 -10.0
x[2:4] = 0          # Elemente 2 bis 4 auf  0 setzen
x[2:4]
## [1] 0 0 0

Alle Elemente von ‘x’ ohne den 2en und 5en?

Elemente von ‘x’ in der anderen Reihenfolge (also von 6 bis 1)?

3. Arithmetik: (*, /, +, -, …)

a = c(10, 4, 20)
a * 10              
## [1] 100  40 200
b = c(5, 2, 7)
a + b
## [1] 15  6 27

Weitere mathematische Operatoren wären z.B.:

sum(a)              # Summe aller Elemente
## [1] 34
sqrt(a)             # Wurzel pro Element
## [1] 3.162278 2.000000 4.472136
a^3                   # Jedes Element hoch 3
## [1] 1000   64 8000
log(a)              # Logarithmus eines jeden Elements
## [1] 2.302585 1.386294 2.995732
exp(a)              # Exponential für jedes Element
## [1] 2.202647e+04 5.459815e+01 4.851652e+08

4. Vektoren manipulieren

length(), seq(), rep(), unique(), table()

Vektorenlänge (wieviele Elemente in einem Vektor?): length() :

y = c("i", "i", "a", "a", "E", "E", "E", "E", "U")
length(y)
## [1] 9

Wie könnte man das letzte Element von ‘y’ listen?

Das vorletzte?

Das Vorletzte und Letzte zusammen?

Intervalle: seq():

seq(10, 20, length=5)   # 5 Intervalle zwischen 10 und 20
## [1] 10.0 12.5 15.0 17.5 20.0
seq(10, 20, by=1.5)     # In Intervallen von 1.5
## [1] 10.0 11.5 13.0 14.5 16.0 17.5 19.0

Wiederholung: rep():

a = c(10, 4, 20)
rep(a, 4)                       
##  [1] 10  4 20 10  4 20 10  4 20 10  4 20
rep(a, each=2)
## [1] 10 10  4  4 20 20

Duplikate entfernen: unique()

y = c("i", "i", "a", "a", "E", "E", "E", "E", "U")
unique(y)   
## [1] "i" "a" "E" "U"

Tabelle: table()

table(y)
## y
## a E i U 
## 2 4 2 1

5. Data-Frames und Matrizen

5.1 Eigenschaften und Indizierung

Einlesen:

pfadu = "http://www.phonetik.uni-muenchen.de/~jmh/lehre/Rdf"
ai = read.table(file.path(pfadu, "ai.txt"))

Eigenschaften überprüfen:

ai
##      F1    Kiefer     Lippe
## 1   773 -25.47651 -24.59616
## 2   287 -27.02695 -26.44491
## 3  1006 -27.24509 -27.59161
## 4   814 -26.05803 -27.17365
## 5   814 -26.15489 -25.93095
## 6   806 -26.37281 -24.44872
## 7   938 -27.35341 -27.22650
## 8  1005 -27.98772 -28.26871
## 9   964 -26.27536 -27.05215
## 10  931 -26.09928 -26.54016
## 11  926 -26.40012 -26.83834
## 12  556 -25.73544 -27.21908
## 13  707 -25.84109 -23.44627
## 14  829 -26.37598 -25.23304
## 15  927 -27.47505 -27.64328
## 16  951 -26.68685 -25.63057
## 17  775 -25.79928 -23.68594
## 18  938 -27.18105 -25.28667
## 19  986 -27.75178 -27.70719
## 20  888 -25.99100 -26.84534
## 21  988 -26.27380 -28.26909
## 22  650 -26.50057 -24.31192
## 23 1026 -27.10303 -24.64248
## 24  992 -28.41081 -28.30641
## 25  896 -26.57372 -25.69383
# Was ist das für ein Objekt? 
class(ai)
## [1] "data.frame"
# die ersten paar Reihen (oder Beobachtungen)
head(ai)
##     F1    Kiefer     Lippe
## 1  773 -25.47651 -24.59616
## 2  287 -27.02695 -26.44491
## 3 1006 -27.24509 -27.59161
## 4  814 -26.05803 -27.17365
## 5  814 -26.15489 -25.93095
## 6  806 -26.37281 -24.44872
# die letzten paar Reihen (oder Beobachtungen)
tail(ai)
##      F1    Kiefer     Lippe
## 20  888 -25.99100 -26.84534
## 21  988 -26.27380 -28.26909
## 22  650 -26.50057 -24.31192
## 23 1026 -27.10303 -24.64248
## 24  992 -28.41081 -28.30641
## 25  896 -26.57372 -25.69383
# Reihen und Spaltenanzahl
nrow(ai)
## [1] 25
ncol(ai)
## [1] 3
dim(ai)
## [1] 25  3
# Die Spaltennamen oder Variablen
names(ai)
## [1] "F1"     "Kiefer" "Lippe"
# das gleiche
colnames(ai)
## [1] "F1"     "Kiefer" "Lippe"
# wobei das "col" für "columns" steht

Zugriff auf Elemente

ai[m,] = Reihe m

ai[,m] = Spalte m

Reihe (Beobachtung) 2:
ai[2,]
##    F1    Kiefer     Lippe
## 2 287 -27.02695 -26.44491
Beobachtungen 2 bis 10:
ai[2:10,]
##      F1    Kiefer     Lippe
## 2   287 -27.02695 -26.44491
## 3  1006 -27.24509 -27.59161
## 4   814 -26.05803 -27.17365
## 5   814 -26.15489 -25.93095
## 6   806 -26.37281 -24.44872
## 7   938 -27.35341 -27.22650
## 8  1005 -27.98772 -28.26871
## 9   964 -26.27536 -27.05215
## 10  931 -26.09928 -26.54016
Beobachtungen 2, 3, und 8:
ai[c(2, 3, 8),]
##     F1    Kiefer     Lippe
## 2  287 -27.02695 -26.44491
## 3 1006 -27.24509 -27.59161
## 8 1005 -27.98772 -28.26871
# oder
vec = c(2, 3, 8)
ai[vec,]
##     F1    Kiefer     Lippe
## 2  287 -27.02695 -26.44491
## 3 1006 -27.24509 -27.59161
## 8 1005 -27.98772 -28.26871
Spalte 2 (Variable 2):
ai[,2]
##  [1] -25.47651 -27.02695 -27.24509 -26.05803 -26.15489 -26.37281 -27.35341
##  [8] -27.98772 -26.27536 -26.09928 -26.40012 -25.73544 -25.84109 -26.37598
## [15] -27.47505 -26.68685 -25.79928 -27.18105 -27.75178 -25.99100 -26.27380
## [22] -26.50057 -27.10303 -28.41081 -26.57372
Für Data-Frames kann man mit $Namen auf die Spalten zugreifen:
names(ai)
## [1] "F1"     "Kiefer" "Lippe"
Das gleiche wie ai[,2]:
ai$Kiefer
##  [1] -25.47651 -27.02695 -27.24509 -26.05803 -26.15489 -26.37281 -27.35341
##  [8] -27.98772 -26.27536 -26.09928 -26.40012 -25.73544 -25.84109 -26.37598
## [15] -27.47505 -26.68685 -25.79928 -27.18105 -27.75178 -25.99100 -26.27380
## [22] -26.50057 -27.10303 -28.41081 -26.57372
# Beobachtungen 2 bis 10 von Variable 2
ai[2:10,2]
## [1] -27.02695 -27.24509 -26.05803 -26.15489 -26.37281 -27.35341 -27.98772
## [8] -26.27536 -26.09928
# oder
ai$Kiefer[2:10]
## [1] -27.02695 -27.24509 -26.05803 -26.15489 -26.37281 -27.35341 -27.98772
## [8] -26.27536 -26.09928
# oder
ai[2:10,"Kiefer"]
## [1] -27.02695 -27.24509 -26.05803 -26.15489 -26.37281 -27.35341 -27.98772
## [8] -26.27536 -26.09928

Reihen 2, 5, 8 von Variablen 2 und 3?

Reihen 12 bis 18 von Variablen 1 und 3?

Ein Minuszeichen in [-n, ] oder [,-n]: alle außer n
# Alle Spalten außer Spalte 1
ai[,2:3]
# oder
ai[,-1]
##       Kiefer     Lippe
## 1  -25.47651 -24.59616
## 2  -27.02695 -26.44491
## 3  -27.24509 -27.59161
## 4  -26.05803 -27.17365
## 5  -26.15489 -25.93095
## 6  -26.37281 -24.44872
## 7  -27.35341 -27.22650
## 8  -27.98772 -28.26871
## 9  -26.27536 -27.05215
## 10 -26.09928 -26.54016
## 11 -26.40012 -26.83834
## 12 -25.73544 -27.21908
## 13 -25.84109 -23.44627
## 14 -26.37598 -25.23304
## 15 -27.47505 -27.64328
## 16 -26.68685 -25.63057
## 17 -25.79928 -23.68594
## 18 -27.18105 -25.28667
## 19 -27.75178 -27.70719
## 20 -25.99100 -26.84534
## 21 -26.27380 -28.26909
## 22 -26.50057 -24.31192
## 23 -27.10303 -24.64248
## 24 -28.41081 -28.30641
## 25 -26.57372 -25.69383
Anzahl der Beobachtungen: nrow():
n = nrow(ai)
n
## [1] 25

Letzte Beobachtung (indem ‘n’ verwendet wird)?

Vorletzte Beobachtung (indem ‘n’ verwendet wird)?

Letzte 3 Beobachtungen (indem ‘n’ verwendet wird)?

5.2 Anwendung arithmetischer Funktionen

(Angenommen, dass die Variablen vom Data-Frame numerisch sind):

class(ai[,1])
## [1] "integer"
# oder
class(ai$F1)
## [1] "integer"
class(ai[,2])
## [1] "numeric"
class(ai[,3])
## [1] "numeric"

20 von allen Werten abziehen:

ai - 20
##      F1    Kiefer     Lippe
## 1   753 -45.47651 -44.59616
## 2   267 -47.02695 -46.44491
## 3   986 -47.24509 -47.59161
## 4   794 -46.05803 -47.17365
## 5   794 -46.15489 -45.93095
## 6   786 -46.37281 -44.44872
## 7   918 -47.35341 -47.22651
## 8   985 -47.98772 -48.26871
## 9   944 -46.27536 -47.05215
## 10  911 -46.09928 -46.54016
## 11  906 -46.40012 -46.83834
## 12  536 -45.73544 -47.21908
## 13  687 -45.84109 -43.44627
## 14  809 -46.37597 -45.23304
## 15  907 -47.47505 -47.64328
## 16  931 -46.68685 -45.63057
## 17  755 -45.79928 -43.68594
## 18  918 -47.18105 -45.28667
## 19  966 -47.75178 -47.70719
## 20  868 -45.99100 -46.84534
## 21  968 -46.27380 -48.26909
## 22  630 -46.50057 -44.31192
## 23 1006 -47.10303 -44.64248
## 24  972 -48.41081 -48.30641
## 25  876 -46.57372 -45.69383

Variable 1 Mal 5:

ai[,1] * 5
##  [1] 3865 1435 5030 4070 4070 4030 4690 5025 4820 4655 4630 2780 3535 4145
## [15] 4635 4755 3875 4690 4930 4440 4940 3250 5130 4960 4480
# oder
ai$F1 * 5
##  [1] 3865 1435 5030 4070 4070 4030 4690 5025 4820 4655 4630 2780 3535 4145
## [15] 4635 4755 3875 4690 4930 4440 4940 3250 5130 4960 4480
neu = ai - 20

ai - neu
##    F1 Kiefer Lippe
## 1  20     20    20
## 2  20     20    20
## 3  20     20    20
## 4  20     20    20
## 5  20     20    20
## 6  20     20    20
## 7  20     20    20
## 8  20     20    20
## 9  20     20    20
## 10 20     20    20
## 11 20     20    20
## 12 20     20    20
## 13 20     20    20
## 14 20     20    20
## 15 20     20    20
## 16 20     20    20
## 17 20     20    20
## 18 20     20    20
## 19 20     20    20
## 20 20     20    20
## 21 20     20    20
## 22 20     20    20
## 23 20     20    20
## 24 20     20    20
## 25 20     20    20

Der obige Befehl funktioniert, wenn die Dimensionen der Data-Frames/Matrizen gleich sind.

dim(ai)
## [1] 25  3
dim(neu)
## [1] 25  3
# daher auch
ai[1:3,2:3] / neu[10:12,1:2]
##        Kiefer     Lippe
## 1 -0.02796543 0.5335476
## 2 -0.02983107 0.5699319
## 3 -0.05083039 0.6032873
# da
dim(ai[1:3,2:3])
## [1] 3 2
# und
dim(neu[10:12,1:2])
## [1] 3 2
# gleich sind.

Dies hingegen funktioniert nicht:

ai[1:3,2:3] / neu[10:12,]
## Error in Ops.data.frame(ai[1:3, 2:3], neu[10:12, ]): '/' only defined for equally-sized data frames

Üben und auswendig lernen:

Allgemein

ls()            # Welche Objekte sind im Verzeichnis?
class()         # was ist das für ein Objekt?

Vektoren

c()             # Elemente in einen Vektor verbinden

Arithmetik

x * 20
x / 20
x + 20
x - 20
x^2           #potenzieren (hier: quadrieren)
sqrt(x)       #Quadratwurzel berechnen
sum(x)        #Summe errechnen
...

Vektoren-Manipulation

length()            # Wieviele Elemente in einem Vektor
seq()               # Intervalle erzeugen
rep()               # Elemente wiederholen
unique()            # Type/Token listen
table()             # Tabellieren

Data-Frames

head()          # Die ersten paar Reihen
tail()          # Die letzten paar Reihen
nrow()          # Anzahl der Reihen
ncol()          # Anzahl der Spalten
dim()           # Dimensionen (Reihen x Spalten)
names()         # Variablen-Namen   
levels()        # Stufen einer Variable

Indizierung

Vektoren

x[2]            # Element 2 von  x
x[2:4]          # Elemente 2 bis  4
x[c(1,4)]       # Elemente 1 und 4

Data-Frames

x[a,b]          # Beobachtungen a von Variable b