Einführung in die Datenverarbeitung mit R+ (Stefan Bosse) [15.11.2024] |
Diese interaktive Übung ist unterteilt in Code Snippets die direkt ausgeführt werden können. Im Code Editor kann das Programm entweder durch Klicken auf den Play Button oder durch CTRL-Enter Tasten durchgefürht werden. Die Code Snippets teilen sich ein gemeinsames Einvironment und bauen teilweise auf einander auf.
▸
[] |
✗
≡
|
Es wird in diesem Kurs der R-Dialekt R+ verwendet. R+ ist eine Reimplementierung von R in JavaScript und läuft direkt in Web Browsern, node.js und node webkit (nw.js) Applikationsprogrammen. Es ist keinee Softwareinstallation erforderlich!
R+ ist nahezu R Syntax mit einigen Ergänzungen die die Programmierung und lesbarkeit von Programmen erleichtern.
Nicht alle R Packages sind in R+ enthalten, und es kann Abweichungen geben.
Dennoch lassen sich die meisten öffentlich verfügbaren algorithmischen Lösungen und Hilfestellungen mit R+ umsetzen.
Rechts unten gibt es eine kleine R+ Hilfe.
Lese "Learning R Programming" Kun Ren,2023
Lese Modul A, Abschnitt "Einführung in die R(+) Programmiersprache".
In dieser Übung sollen folgende Ziele erreicht werden:
Werte und Texte können mit den Funktionen print
, cprint
und logg
ausgegeben werden.
print
ist die Standardfunktion (aber nur Ausgabe eines Arguments)logg
gibt zusäzlich den Argumentenausdruck aus (auch mehlr als ein Argument möglich)cprint
gibt eine kompkate Form aus, eher im C-style
▸
[] |
✗
≡
|
Eine Variable ist in R eine Referenz auf Werte. Werte können sein:
numeric
logical
character
list
function
Variablen kann ein neuer Wert (also eine Referenz) zugewiesen werden mit den <-
und =
Operationen. Der Pfeiloperator kann bevorzugt verwendet werden, der Unterschied zwischen beiden ist marginal, wobei =
noch für benannte Funktionsparameter verwendet wird. Ausdrücke können beliebibig komplex sein, teils aus Operanden mit unterschiedlichen Datentypen bestehen. Es kann aber auch zu typsisierten Fehlermeldungen kommen. So können in R Zeichenketten nicht mittels +
verknüpft werden (es ist die Funktion paste
zu verwenden).
▸
[] |
✗
≡
|
Variablenamen können aus den Zeichen a
-z
, A
-Z
, den Zahlen 0
-9
(außer an erster Stelle) und einem Punkt .
bestehn.
Aufgabe 1. Zerlege folgenden komplexen Ausdruck in eine Sequenz von einfachen Asudrücken mit genau einer arithmetischen Operation (ggfs. unter Zuhilfename von weiteren Variablen).
▸
[] |
✗
≡
|
YTwtMSBiPC0yIGM8LTMKdDE8LWErYgp0MTwtdDErYwp0MjwtYS1iCnQyPC10Mi1jCnQzPC1hKmIKdDM8LXQzKmMKejwtdDEvdDIKejwteip0MwpwcmludCh6KQ==
Zuweisungsoperation sind:
x <- e
x = e
<-
Operator (hier gar keinen).x <<- e
▸
[] |
✗
≡
|
Berechnungsanweisungen können wie in jeder anderen Programmiersprache in Funktionen gebunden werden:
Eine Funktionsdefinition besteht aus:
function
▸
[] |
✗
≡
|
Aufgabe 2. Erstelle ine Funktion mean(x,y,z)
die den arithmetischen Mittelwert aus den drei Paremetern x, y und z berechnet. Teste die Funktion mit den Werten 14,9,13.
▸
[] |
✗
≡
|
ZnVuY3Rpb24gbWVhbih4LHkseikgewogICh4K3kreikvMwp9CmxvZ2cobWVhbigxNCw5LDEzKSk=
Alle Variablen werden in einem globalen Arbeitsbereich (Kontext, Environment) angelegt, der bereits vordefinierte Werte enthält. Innerhalb von Funktionen existiert ein lokaler Kontext und Arbeitsbereich, und Variablenzuweisungen finden in diesem statt. Funkctionsparameter sind immer lokal.
▸
[] |
✗
≡
|
Aufgabe 3. Welche Sichtbarkeit haben die beiden Variablen x und x2 in der Funktion foo?
Will man in Funktionen "globale" Variablen ändern muss man den <<-
Operator anstelle <-
oder =
verwenden!
Man kann das aktuelle Environment verändern (Module env), z.B. mittels der rm
Funktion auch Variablen (oder Funktionen) entfernen. da Variablen ständig hinzugefügt werden, kann es sinnvoll sein den Arbeitsbereich wieder "aufzuräumen".
▸
[] |
✗
≡
|
Konstante Zeichenketten werden mit der "ABC"
Syntax eingeführt. Zeichenketten können mit der paste
Funktion zusammengefhrt werden (jeweils mit Trennzeichen):
Folgende Basisoperationen existieren:
abbreviate
liefert eine Abkürzung einer Zeichenkettechartr(old,new,x)
ersetzt einen oder mehrere Zeichen in einer Zeichenkette (Ergebnis wird in einer Liste zurückgegeben)paste(a,b,c,sep?=<string>)
oder paste(<list>,collapse=<string>)
fügen einzelne Werte zu einem String zusammen (sep legt den Separator fest), oder Elemente einer Liste wenn collpase angegeben wird (der Seperator) strsplit(x,split)
zerlegt eine Zeichenkette in eine Liste von Tokens (kleinere Zeichenketten)substr(x,start,stop)
liefert eine Teilzeichenkette beginnend bei start und bis stop (Zeichenposition)tolower
wandelt alle Zeichen auf Kleinschreibung umtoupper
wandelt alle Zeichen auf Großschreibung umFunktionen erwarten Argumente in der Reihenfolge der Parameterdefinition, z.B. foo(a,b,c) erwartet als erstes Argument a, dann b, d.h., foo(1,2,3). Alternativ können die Argumente auch den Parameternamen zugewiesen werden, wo die Reihenfolge dann keine Rolle mehr spielt, also z.B. foo(c=3,a=1,b=2)
▸
[] |
✗
≡
|
Aufgabe 4. Zerlege die Zeichenkette "A-1 B-2 C-1" in 1. Tokens die durch ein Leerzeichen getrennt sind (als Liste), und dann 2. diese Tokens zerlegen mittels des Bindestrichs. Hinweis: Die Stringoperationnen können auch auf Vektoren von Zeichnketten angewendet werden!. strsplit
liefert eine Liste, kann aber mit as.vector
in einen Vektor umgewandelt werden.
▸
[] |
✗
≡
|
cyA8LSAiQS0xIEItMiBDLTEiCnMudG9rZW5zIDwtIHN0cnNwbGl0KHMsJyAnKQpzLnRva2VuczIgPC0gc3Ryc3BsaXQoYXMudmVjdG9yKHMudG9rZW5zKSwnLScpCmluc3BlY3Qocy50b2tlbnMyW1sxXV0p
Listen sind geordnete Werte die entweder über einen numerischen Index oder über einen Elementnamen referenziert werden können. Listen werden mit der list
Funktion erzeugt. Ein numerischer Selektor wird durch den [i]
Operator eingeleitet.
Achtung: Verwendung des [index] Operators liefert hier wieder eine Liste mit einem Element! Will man das Listenelement direkt lesen verwendet man den [[i]]
Operator!
Benannte Listenelemente können bei der Erzeugung mittels name=val
erstellt werden, oder später durch die names
Funktion. Listen könen mehrsortig sein (d.h., Elemente von verschiedenen Datentyp). Neue Elemnte können an einer bestimmten Position mittels append
hinzugefügt werden.
▸
[] |
✗
≡
|
In R+ gibt es die Kurzschreibweise {a=1,b=2,..}
für list(a=1,b)2,..)
! Es können auch numerisch indizierte Listen mittels der Syntax {1,2,3,..}
(oder mit list) erzeugt werden. Hier ist nur eine numerische Referenzierung der Elemente möglich, also z.B. v[1]
.
Listen können mit der sort(FUN=function (a,b) { λ })
sortiert werden. Dabei sind a und b jeweils zwei Elemente aus der Liste die verglichen werden müssen. Wenn ein Tausch durchgeführt werden muss ist γ=TRUE, ansonsten γ=FALSE. Ein Beispiel für γ (funktioniert auch bei Strings) wäre a>b
, dann wird die Liste aufsteigend sortiert.
Aufgabe. Zerlege die Zeichenkette "A-1 B-2 C-1" in Tokens durch Leerzeichen getrennt, verändere die Reihenfolge der Listenelement derart dass C B A als Reihenfolge entsteht, und füge die Listenelement wieder zu einer Textzeichenkette zusammen.
▸
[] |
✗
≡
|
cyA8LSAiQS0xIEItMiBDLTEiCnNvcnQocy50b2tlbnMsRlVOPWZ1bmN0aW9uIChhLGIpIHsKICBhPGIKfSkKbG9nZyhwYXN0ZShzLnRva2Vucyxjb2xsYXBzZT0nICcpKQ==
Vektoren sind ähnlich Listen. Vektoren bieten anders als Listen die Möglichkeit Werte in kompakten (linearen) Arrays zu speichern. Daher kann ein bestimmter Datentype (mode) angegeben werden. Ein von einer Argumetenliste initialisierter Vektor wird mit c
, ein konstant initialisierter mit vector
erzeugt. Vektoren sind immer eindimensional. Mehrdimensionale "Vektoren" sind Arrays und Matrizen (zweidimensional), Teilbereiche eines Vektors können durch den Bracketoperator ausgewählt werden.
Folgende Vektorfunktionen sind wichtig:
min
, max
, range
, mean
, sum
fivenum
; liefert {min, quantile1, median, mean, qunatile3, max} bei numerischen Vektorentable
bei kategorischen Vektoren
▸
[] |
✗
≡
|
In R+ gibt es die Kurzschreibweise [v1,v2,..]
für c(v1,v2,..)
um initialisierte vektoren zu erzeugen!
In R+ werden Matrizen spaltenweise organisiert (in R zeilenweise), d.h., eine Initialisierung mit einem Vektor [1,2,3,4]
und zwei Spalten führt zu den Werten 1 und 2 in der ersten Zeile!
Aufgabe 6. Analysiere die folgenden Vektoren klassengerecht, notiere die Ergebnisse. Was bedeuten die statistischen Werte? Führe eine Recherche durch.
▸
[] |
✗
≡
|
dXNlIG1hdGgKdm4gPC0gWzEwMCw1LDk5LC00LDEwMCwxMTAsNTVdCnZzIDwtIFsiYSIsImIiLCJhIiwiYyIsImEiLCJiIiwiYiJdCmxvZ2coZml2ZW51bSh2bikpCmxvZ2codGFibGUodnMpKQ==
Vektoren können mit der universellen plot Funktion visualisiert werden, wie im nachfolgenden Beispiel gezeigt ist. Die Nutzung der plot Funktion bedarf der Einbeziehung des plot Packages mit use plot
.
▸
[] |
✗
≡
|
Aufgabe 7. Was ist der Unterschied zwischen den beiden Plot Funktionsaufrufen?
Eine Matrix (ähnlich einem Datenrahmen, folgendes gilt i.A. auch für Datenrahmen) ist eine zweidimensionale Tabelle und wird mit der matrix(init,nrow,ncol)
Funktion erzeugt. Der Datentyp muss skalar bzw. atomar sein (numeric
, logical
, `character').
Unterschied Datenrahmen und Matrix: Eine Matrix sollte nur für "homogene" numerische Werte verwendet werden, wie z.B. Pixelwerte von Bildern oder mathematische Matrizen. Ein Datenrahmen ist hingegen eine universelle Tablle dessen Spalten verschiedene Variablen sind und die Zeilen einzelne Instanzen darstellen (z.B. von Experimenten).
Folgende Matrixfunktionen sind wichtig:
col(m)
liefert eine Matrix von m mit Spaltenindexwertendiag(m)
liefert die Diagonalelemente einer Matrixdim(m)
liefert die Dimensionen einer Matrixrow(m)
liefert eine Matrix von m mit Zeilenindexwertennrow
, ncol
, colnames
um einzelne Informationen über die Matrix zu erhaltenmin
, max
, minMax
, range
, mean
, sum
und fivenum
(Vorsicht beu fivenum: Median und Quantile Berechnung kann sehr rechenintensitiv sein)%*%
▸
[] |
✗
≡
|
In R+ gibt es die Kurzschreibweise [|v11,v12,..,c1n;c21,c22,..|]
anstelle für matrix(c(v11,...),...)
um initialisierte Matrizen zu erzeugen!
Aufgabe 8. Was ist der Unterschied bei der Initialisierung von data1, data2 und data3? Was passiert wenn anstelle 1:9
der Bereichsvektor 1:3
verwendet wird?
Relationale Ausdrücke angewendet auf Matrizen (oder natürlich auch Vektoren) liefern eine Boolesche Matrix oder einen Vektor (entweder mit Booleschen Werten FALSE oder TRUE, oder numerisch mit 0 und 1 Werten gefüllt)!
Will man die Positionen (row,col) haben kann man die which
Funktion verwenden, die entweder den linearen Index (spaltenorientiert) oder mit der arr.ind=TRUE
Option auch als Matrix liefert.
▸
[] |
✗
≡
|
Aufgabe 9. Wenn ein Bild durch eine Matrix repräsentiert wird, wie kann eine Binärisierung des Bildes erreicht werden? Wählen im folgenden Beispiel den Schwellwert mit t=0.5. Alle Matrixelemente mit x < t sollen zu Null, und alle mit x ≥ t zu 1 werden.
▸
[] |
✗
≡
|
ZGF0YTMgPC0gbWF0cml4KHJ1bmlmKDkpLG5yb3c9MyxuY29sPTMpCmRhdGEzLmJpbiA8LSBjb3B5KGRhdGEzKQpkYXRhMy5iaW5bZGF0YTMuYmluPDAuNV0gPC0gMApkYXRhMy5iaW5bZGF0YTMuYmluPj0wLjVdIDwtIDEKbG9nZyhkYXRhMy5iaW4p
Matrizen und Bilder
Matrizen können für die Speicherung von Grauwertbildern verwendet werden. Das nachfolgende Beispiel zeigt die Visualisierung einer Matrix als Grauwertbild.
▸
[] |
✗
≡
|
Bildverarbeitung wird in einem anderen Tutorial eingeführt.
v[i]
sowohl lesend als auch schreibend ausgewählt werden.l[[i]]
verwendet werden um an das Listenelement zu gelangenv$x
referenziert werden[a:b]
Operator mit index={a,a+1,..,b} ausgewählt werden[row,col,..]
referenziert werden
▸
[] |
✗
≡
|
Arithemtische (+
, -
, *
, /
, %
, %%
), relationale (<
, >
, >=
, <=
, ==
, !=
) und bitweise logische (&
, |
) Operationen können auf einer Vielzahl von Datentypen inklusive Aggregationen wie Listen und Vektoren direkt angewendet werden. Bei Listen und Vektoren werden diese Operationen elementweise angewendet und erzeugen einen neuen Vektor.
▸
[] |
✗
≡
|
Man kann Vektoren mit der c(v1,v2,..)
Funktion zusammenfügen!
Aufgabe 10. Zerlege und analysiere den primes[primes>5]
Ausdruck. Was liefert primes>5
und wie funktioniert die Reduktion (Filterung) des Vektors? Erstelle einen Teilvektor aus primes der nur Werte < 5 und Werte > 10 enthält.
▸
[] |
✗
≡
|
cHJpbWVzIDwtIFsxLDMsNSw3LDExLDEzLDE3LDIzLDI5XQpwcmltZXMuc2VsZWN0ZWQ1IDwtIHByaW1lc1twcmltZXM8NV0KcHJpbWVzLnNlbGVjdGVkMTAgPC0gcHJpbWVzW3ByaW1lcz4xMF0KcHJpbWVzLnNlbGVjdGVkIDwtIGMocHJpbWVzLnNlbGVjdGVkNSxwcmltZXMuc2VsZWN0ZWQxMCk=
R bietet Schleifen für die wiederholte Ausführung von Anweisungen und bedingte Anweisungen (if-else). Schleifen sind Iteratoren über Bereiche, Vektoren, oder Listen, und für wiederholte arithmetische Berechnungen hilfreich.
▸
[] |
✗
≡
|
Aufgabe 11. Berechne die Summe eines Vektors
▸
[] |
✗
≡
|
eCA9IFsxLDIsMyw0XQpzdW0gPSAwCmZvciAoaSBpbiB4KSB7CiAgc3VtID0gc3VtICsgeFtpXQp9CnByaW50KHN1bSk=
Eine Datentabelle besteht auf Spalten und Zeilen. Eine Zeile kann man als Liste auffassen, i.A. mit benannten Spaltennamen (oder numerisch indiziert). Die Zeilen können auch mit Namen versehen sein, i.A. werden Zeilen aber numerisch indiziert (erste Zeile nesitzt den Index 1).
Datentabellen werden in R als data.frame mit der Funktion data.frame()
erzeugt.
Es gibt auch Funktionen, wie z.B. das Lesen und Parsen einer CSV Datei, die Daten in Form eines data.frame objects erzeugen.
Häufig werden Datentabelle aus Spaltenvektoren oder Spaltenlisten erzeugt.
▸
[] |
✗
≡
|
Es gibt eine Vielzahl von Operationen und Funktionen die man auf Datentabellen anwenden kann:
nrow
, ncol
, colnames
und rownames
liefern Informationen über die Tabelle;
colSums
und rowSums
liefern numerische Aggregate der Zeilen und Spalten
Die Selektion einer Zeile mittels df[row,]
liefert eine Liste
Der Selektor df[row,]
kann auch auf der linken Seite einer Zuweisung verwendet werden um eine bestehende Zeile zu ändern oder eine Zeile hinzuzufügren
Spalten können anhand der Spaltennamen ausgewählt werden (lesend und verändernd) via df$col
oder df['colname']
, ebenso können neue Spalten hinzugefügt werden
Aufgabe 12. Erzeuge eine Datentabelle mit den Spalten x,sin,cos,tan
für die Werte x im Bereich 0 bis 6 in den Abständen 0.5. Die Spalten sin,cos,tan
sollen mit den mathematischen Funktionen programmatisch berechnet werden.
▸
[] |
✗
≡
|
b3B0aW9ucyhkaWdpdHM9MikKeCA8LSBbMC41LDEsMS41LDIsMi41LDMsMy41LDQsNC41LDUsNS41LDZdCmRmIDwtIGRhdGEuZnJhbWUoeD14LHNpbj1zaW4oeCksY29zPWNvcyh4KSx0YW49dGFuKHgpCmxvZ2coZGYp
DATA: Variable dataIRIS Type: { length : number, width : number, petal.length : number, petal.width : number, species : string } [151]
Der Datensatz ist bereits im Notebook enthalten und wird als Datenrahmen (data.frame) data.iris
zur Verfügung gestellt!
▸
[] |
✗
≡
|
▸
[] |
✗
≡
|
Die Zielvariable y liegt als kategorische Variable vor. Eine Kodierung in eine numerische kann wie folgt mit der factor Funktion durchgeführt werden:
▸
[] |
✗
≡
|
Aufgabe 13. Was enthält y.code
? Was bewirkt factor
(verwende print) und was enthält y.levels
?
Die universellste Analysefunktion ist summary
, gefolgt von fivenum
für numerische und table
für kategorische Variablen.
Aufgabe 14. Analysiere den Datensatz mit 1. summary
, 2. Einzelne Spalten mit fivenum
und table
. Welche Eigenschaften haben die einzelnen Variablen (Attribute)?
R summary liefert bei kategorischen Variablen keine Verteilungsanalyse. Mit dem Argument extended=TRUE
kann diese hier aktiviert werden.
▸
[] |
✗
≡
|
bG9nZyhzdW1tYXJ5KGRhdGEuaXJpcykpCmxvZ2coZml2ZW51bShkYXRhLmlyaXNbLDFdKSkKbG9nZyhmaXZlbnVtKGRhdGEuaXJpc1ssMl0pKQpsb2dnKGZpdmVudW0oZGF0YS5pcmlzWywzXSkpCmxvZ2coZml2ZW51bShkYXRhLmlyaXNbLDRdKSkKbG9nZyh0YWJsZShkYXRhLmlyaXNbLDVdKSk=
Die plot(x,y)
Funktion ist universell und kann verschiedene Datenformate darstellen. Am häuigsten wird man sie für Punkt- und Linienverläufe verwenden. Die Breite (oder Höhe) des Plotfensters kann mit dev.new(width=300)
gesetzt werden.
▸
[] |
✗
≡
|
Aufgabe 15. Benutzte die plot(x,y)
Funktion um Zusammenhänge zwischen den einzlenen Variablen x1 bis x4 und mit der Zielvariablen y.code herzustellen. Findet man Strukturen, können schon geeignete Kandidaten für die Klassifikation gefunden werden?
▸
[] |
✗
≡
|
cGxvdCh4MSx5LmNvZGUpCnBsb3QoeDIseS5jb2RlKQpwbG90KHgzLHkuY29kZSkKcGxvdCh4NCx5LmNvZGUp
Grafisch konnten bereits Eingabevariablen mit der (nuemrisch kodierten) Ausgabevariable in einen Zusammenhang gesetzt werden. Analytisch kann man neben dem Informationsgewinn eine einfache Partitionierung der numerischen Eingabevariablen nach der Zielvariable vornehmen. Das ist im nächsten Beispiel gezeigt.
▸
[] |
✗
≡
|
Aufgabe 16. Analysiere die Partitionen. Lassen sich geeignete Teilungspunkte für wenigstens einer Zweiklassenseparation mit einer der Attribute erreichen?
▸
[] |
✗
≡
|