<- 7 a
Erste Schritte mit R, Teil 2
Variablen
In R (wie auch in den meisten anderen Programmiersprachen) kann Daten (einzelne Werte, aber auch Größeres) im Arbeitsspeicher ablegen und mit einem Namen versehen und so eine Variable erzeugen.
Wir erstellen eine Variable mit dem Namen a
, der wir den Wert 7 zuweisen:
Die Variable wird nun im Environment (Teilfenster rechts oben in RStudio) aufgeführt.
Wir können den Wert der Variablen einsehen, indem wir ihren Namen verwenden:
a
[1] 7
Wir können die Variable auch in arithmetischen Ausdrücken verwenden, z.B.:
3*a + 1
[1] 22
Hier ersetzt R die Variable a
durch ihren Wert 7 und führt dann die Rechnung durch.
Der Begriff “Variable” rührt daher, dass man den Wert einer Variablen ändern kann, einfach, indem man einen neuen Wert zuweist:
<- 10 a
Derselbe Ausdruck wie zuvor ergibt nun ein anderes Ergebnis:
3*a + 1
[1] 31
Der Pfeil <-
heisst “Zuweisungs-Operator” (assignment operator). Er weist einer Variablen einen Wert zu (assigns a value to a variable).
Der Pfeil kann auch andersherum geschrieben werden. Er weist stets vom Wert zum Variablen-Namen:
<- 10 a
ist dasselbe wie
10 -> a
Als dritte Möglichkeit kann man auch
= 10 a
schreiben, d.h., =
wird wie <-
gelesen.
Beispiel: Die Lösungsformel für quadratische Gleichungen:
Sicher erinnern Sie sich an diese Formel aus der Schule, um die Lösungen der quadratischen Gleichung \(ax^2 + bx + c = 0\) zu finden:
\[ x_{1;2} = \frac{-b \pm \sqrt{b^2 - 4ac}}{2a} \]
Wir schreiben die Formel in R-Notation. Zunächst lesen wir das “\(\pm\)” als “+”:
-b + sqrt( b^2 - 4*a*c ) ) / ( 2*a ) (
Wenn wir dies ausführen, beschwert sich R: Error: object 'b' not found
R kann den Ausdruck nicht ausrechnen, da nur für a
ein Wert vorliegt, nicht aber für b
(und auch nicht für c
).
Lösen wir die Gleichung \(3x^2 + 5x - 3 = 0\). Wir weisen die Werte der Koeffizienten Variablen zu, die die Namen a
, b
und c
tragen:
<- 3
a <- 5
b <- -3 c
Nun liefert under Ausdrick die erste Lösung
-b + sqrt( b^2 - 4*a*c ) ) / ( 2*a ) (
[1] 0.4683749
Die zweite Lösung finden wir, indem wir das “\(\pm\)” als “\(-\)” schreiben:
-b - sqrt( b^2 - 4*a*c ) ) / ( 2*a ) (
[1] -2.135042
[Die erste Vorlesung endete hier. Der Rest kommt nächste Woche.]
Namen
Der Name einer Variable muss kein einzelner Buchstabe sein:
<- 15 ein_langer_name
Auch so ein langer Name kann in einem Ausdruck stehen:
2 * ein_langer_name + 1
[1] 31
Für die Variablen-Namen (fachsprachlich identifiers) gelten folgende Regeln:
Nur Buchstaben und Ziffern sind erlaubt, sowie der Unterstrich (
_
) und der Punkt (.
).Der Name darf nicht mit einer Ziffer beginnen.
Aufgabe
Berechnen Sie die beiden Lösungen der quadratischen Gleichung \(2x^2 - 3x - 6\frac{1}{2} = 0\). Weisen Sie die beiden Lösungen den Variablen x1
und x2
zu. Setzten Sie dann die Variablen in die Gleichung ein, um zu prüfen, ob man wirklich 0 erhält (“Probe”).
Was geschieht, wenn Sie in der Gleichung den konstanten Term von \(-6\) auf \(6\) abändern? Warum?
Etwas mehr Terminologie
Ausdrücke
In R-Code wie z.B. a <- 2*3
nennt man den Teil rechts, also 2*3
einen “Ausdruck” (expression). Ein Ausdruck ist also Code, der zu einem Wert ausgewertet werden kann. (An expression is code that can be evaluated to a value.) Ein Ausdruck kann dann z.B. einer Variablen zugewiesen werden (a <- 2*3
), oder es kann auch Teil eiens größeren Ausdrucks sein (sqrt(2*3)
).
Betrachten wir den Ausdruck 2*a + sqrt(3)
.
Hier sehen wir alle Komponenten, aus denen man einen Ausdruck zusammen bauen kann:
- Literale (literals), d.h. explizit angegebenen Werten (hier:
2
und3
) - Variablen (variables), für die R beim Auswerten ihren Wert einsetzt (hier:
a
) - Operatoren (operators), d.h., Zeichen, die eine Rechenoperation durchführen, die zwei Ausdrücke verknüpft. (In unserem Beispiel verknüpft der Multiplikations-Operator
*
das Literal2
und die Variablea
und der Additions-Operator+
verknüpft die Teilausdrücke2*a
undsqrt(3)
.) - Funktionsaufrufe (function calls): In unserem Beispiel ist das
sqrt(3)
- Wie erwähnt, kann man Teilausdrücke in runde Klammern setzen, um klar zu stellen, was zusammen ausgewertet werden soll, besonders, wenn man von Punkt-vor-Strich abweichen will.
Ein einzeln stehender (Literal-)Wert oder eine einzeln stehende Variable gelten auch als Ausdruck.
Leerzeichen oder Zeilenumbrüche zwischen den
Funktionsaufrufe
Wir sehen uns Funktionsaufrufe noch mal genauer an.
Hier runden wir \(pi\) auf drei Nachkommastellen:
round( 3.14159265, 3 )
[1] 3.142
Ein Funktionsaufruf besteht immer aus dem Funktionsnamen (hier: round
), gefolgt von einem Paar runder Klammern (parentheses, parens), die die Funktionsargumente (arguments) enthalten. Für jedes Argument ist ein Ausdruck anzugeben. Wenn eine Funktion mehrere Argumente erwartet, müssen die Ausdrücke durch Kommas getrennt werden.
Die Funktion round
erwartet zwei Argumente, nämlich erst die zu rundende Zahl und dann die Anzahl der Nachkommastellen.
Wenn man ?round
angibt, erscheint die Hilfeseite für round
. Dort finden wir die “Signatur” der Funktion:
round(x, digits = 0, ...)
Dies bedeutet: Das erste Argument heisst x
, das zweite digits
. Weiter unten steht, wie die Argumente interpretiert werden. (x
ist die zu rundende Zahl, digits
die Anzahld er Nachkommastellen.)
Für digits
gibt es einen sog. Vorgabe-Wert (sog. default value), der durch das = 0
angegeben ist. Das bedeutet, dass man dieses Argument weg lassen darf (optional argument), und das R dann den Default-Wert (hier 0, also keine Nachkommastellen) dafür einsetzt:
round( 3.14159265 )
[1] 3
Die Argumente müssen entweder in genau der Reihenfolge übergeben werden, in der sie in der Signatur stehen (positional arguments) oder man gibt die Argument-Namen wie folgt mit an (named arguments). Dann darf man von der Reihenfolge abweichen:
round( digits=3, x=3.14159265 )
[1] 3.142
Das ...
bedeutet (vereinfacht gesagt), dass es evtl. weitere Argumente gibt (die man nur mit Angabe des Argument-Namens verwenden darf).
Boolsche Ausdrücke
Betrachten Sie diesen Ausdruck:
3 < 7
[1] TRUE
Hier wurde der Vergleichs-Operator <
(“kleiner”) verwendet. Da der Wert links von <
tatsächlich kleiner ist als der Wert rechts, ist der Ausdruck “wahr” (TRUE
). Dies ist ein Wert, genauso wie 3
oder -2.765
Man kann ihn also einer Variablen zuweisen:
<- 3 < 7
a a
[1] TRUE
Solche Werte nennt man “Wahrheitswerte”, “logische Werte” (logical values) oder Boolsche Werte (Boolean values, nach dem Mathematiker George Boole)
Logische Werte entstehen z.B., wenn man Vergleichoperatoren verwendet. Es gibt folgende:
<
und>
stehen für “kleiner als” und “größer als”<=
und>=
stehen für “kleiner oder gleich” (sonst \(\le\) geschrieben) und “größer oder gleich” (\(\ge\))==
bedeutet “gleich”. Beachte, dass man==
schreiben muss, den=
ist der Zuweisungsoperator (s.o.)!=
ist wie man “ungleich” (\(\neq\)) tippt
Datentypen
Jeder Ausdruck hat einen Daten-Typ (data type):
Normale Zahlen haben den Typ “numeric”, auch “double” genannt. (“Double” steht für “double-precision floating-point number”; das ist das Standardformat, in dem Computer Kommazahlen speichern.)
Die Funktion class
zeigt den Datentyp ihres Arguments an:
class(3.14)
[1] "numeric"
Machmal findet man auch den Typ “integer” (Ganzzahl).
Die eben erwähnten Boolschen Ausdrücke haben den Datentyp “logical”
class( 7 > 3 )
[1] "logical"
class( TRUE )
[1] "logical"
Character strings
Wichtig ist auch der Typ “Zeichenkette” (engl. string of characters, in der Informatik normalerweise kurz als string bezeichnet, in R aber abgekürzt als “character”):
<- "hello"
s class(s)
[1] "character"
Eine Zeichenkette muss stets in Anführunsgzeichen (double quotes, "..."
) gesetzt werden.
Wenn man
<- hello s
schreibt, denkt R, dass man eine Variable mit dem Namen hello
meint und beschwert sich, dass diese nicht definiert wurde.
Vergleichen Sie
<- "a"
ss ss
[1] "a"
<- a
ss ss
[1] TRUE
Mit Zeichenketten kann man natürlich nicht rechnen:
"Hello" + 17
Hier beschwert sich R: Error in "Hello" + 17 : non-numeric argument to binary operator
, d.h., es bemängelt, dass “Hello” keine Zahl ist und man damit nicht addieren kann.
Es gibt aber Funktionen, die Strings als Argumente erwarten. Zum Beispiel
nchar
(number of characters) zählt, wie viele Zeichen der String enthält:
nchar( "Hello" )
[1] 5
Die Funktion toupper
(“to upper case”)wandelt einen String in Grossbuchstaben (engl. “upper-case letters”) um:
toupper( "Hello" )
[1] "HELLO"
So fügt man mehrere Strings zu einem String zusammen:
paste( "Hello", "world" )
[1] "Hello world"
Wir werden noch weiter solche Funktionen kennen lernen
Vektoren
c
(für “concatenate”) können wir mehrere Werte (desselben Datentyps) zu einem sog. “Vektor” zusammenstellen:
<- c( 3, 5, 2, 7, -1, 2.5, 3 ) v
Die Variable v
enthält nun nicht einen Wert sondern sieben:
v
[1] 3.0 5.0 2.0 7.0 -1.0 2.5 3.0
Wir können mit eckigen Klammern (square brackets) auf einzelne Werte zugreifen, z.B. auf den vierten Wert (immer von links):
4] v[
[1] 7
Vektor-Operationen
Viele Operationen in R können auch mit Vektoren arbeiten. Hier zählen wir z.B. zu jedem Wert in v
1 hinzu:
+1 v
[1] 4.0 6.0 3.0 8.0 0.0 3.5 4.0
Oder wir fragen, welche Werte größer als 3 sind:
> 3 v
[1] FALSE TRUE FALSE TRUE FALSE FALSE FALSE
und erhalten eine Vektor von “logical”-Werten.
Nun verwenden wir die Funktion seq
(für “sequence”), um einen Vektor zu erzeugen, der die Zahlen von 1 bis 7 enthält, und weisen dies der Variablen w
zu:
<- seq(7)
w w
[1] 1 2 3 4 5 6 7
Nun können wir die beiden Vektoren v
und w
Element für Element (element-wise) addieren:
+ w v
[1] 4.0 7.0 5.0 11.0 4.0 8.5 10.0
(Beachten Sie das beide Vektoren gleich viele Element haben.)
Funktionen wirken oft auch element-wise.
Beispiel: Wir schieben jedes Element in v
durch die Exponentialfunktion \(e^x\):
exp(v)
[1] 20.0855369 148.4131591 7.3890561 1096.6331584 0.3678794
[6] 12.1824940 20.0855369
Beipsiel 2: Die Quadratwurzeln der Zahlen in v
:
sqrt(v)
Warning in sqrt(v): NaNs produced
[1] 1.732051 2.236068 1.414214 2.645751 NaN 1.581139 1.732051
Hier bekommen wir eine Warnung, weil der 5. Wert nicht ebstimmt werden konnte (da die Quadratwurzel von negativen Zahlen nicht definiert ist). Statt dessen wird die “Pseudo-Zahl” NaN (für “not a number”) in den Eregnis-Vektor eingetragen.
Wir können die Zahlen in v auch der Größe nach sortieren:
sort(v)
[1] -1.0 2.0 2.5 3.0 3.0 5.0 7.0
Terminologie
- Die einzelnen Werte in einem Vektor heißen “Elemente” (elements).
- Die Anzahl der Elemente eines Vektors ist seine Länge (length).
- Die Position eines Elements ist sein “Index” (index).
- Auch ein Vektor istb ein Ausdruck oder kann Teil eiens Ausdrucks sein.
- Ein einzelner Wert heißt “Skalar” (scalar)
In den meisten Programmiersprachen wird streng unterschieden zwischen Skalaren und Vektoren der Länge 1. Ein Vektor ist ein andere Datentyp als ein Skalar. In R ist das nicht so: Alles ist ein vektor, und ein skalarer Wert ist einfach ein Vektor der Länge 1.
Deshalb steht vor allen Werten immer ein [1]
. Es zeigt an dass das Element mit dem Index 1 folgt (und bisher war das meist das einzige Element des Vektors).
Bei langen Vektoren sehen wir auch andere Index-Angaben. Hier ein Vektor mit den Zahlen von 100 bis 130:
seq( 100, 130 )
[1] 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118
[20] 119 120 121 122 123 124 125 126 127 128 129 130
Reduzierende Funktionen
In den Beispielen von oben war das Ergebnis aller Audrücke mit Vektoren stets ein Vektor mit ebensovielen Elementen wie der Vektor, den wir in die Rechnung hinein gegeben haben.
Es gibt aber auch Funktionen, die eine Vektor mit mehreren Elementen zu einem einzelnen Wert zusammen fassen, sog. zusammenfassende Funktionen (summarising fucntions), auch reduzierene Funktionen (reducing functions) genannt.
Wichtigstes Beispiel ist die Bildung des Mittelwertes (average oder mean). Hierzu dient die Funtkion mean
:
mean( v )
[1] 3.071429
Häufig möchte man auch einfach alle Elemente aufaddieren. Die Funktion hierfür heißt sum
:
sum( v )
[1] 21.5
Wir können auch den Median berechnen:
median( v )
[1] 3
Dies bedeutet, dass ebenso viele Zahlen in v
größer als 3 sind wie Zahlen kleiner als 3 sind, also 3 in der Mitte liegt, wenn man den Vektor sortierte.
Andere gerne verwendete Statistiken sind Varianz (variance) und Standard-Abweichung (standard deviation, SD), die durch die Funktionen var
und sd
berechnet werden:
var( v )
[1] 6.202381
sd( v )
[1] 2.490458
Auch length
ist eine summarising function. Sie zählt einfach, wie viele Elemente der Vektor enthält:
length( v )
[1] 7
Erzeugung von Vektoren
Wir haben zwei Methoden zur Erzeugung von Vektoren besprochen: c
und seq
.
Hier noch einige weitere Details hierzu:
Mit der Funktion c
kann man nicht nur einzelne Elemente, sondern auch mehrere Vektoren zusammen fassen. Der folgende Ausdruck hängt den Vektor v
von zuvor, die Zahl 100
und den Vektor w
(mit den Zahlen von 1 bis 7) aneinander:
c( v, 100, w )
[1] 3.0 5.0 2.0 7.0 -1.0 2.5 3.0 100.0 1.0 2.0 3.0 4.0
[13] 5.0 6.0 7.0
Die Funktion seq
kann auch noch mehr:
Mit einem Argument zählt sie bis zur angegeben Zahl:
seq(7)
[1] 1 2 3 4 5 6 7
Mit zwei Argumenten zählt sie vom ersten zum zweiten Argument
seq( 5, 10 )
[1] 5 6 7 8 9 10
Mit drei Argumenten kann man auch eine Schrittweite angeben. Hier zählen wir von 2 bis 6 in Schritten von jeweils 0.5:
seq( 2, 6, 0.5 )
[1] 2.0 2.5 3.0 3.5 4.0 4.5 5.0 5.5 6.0
Die Form mit zwei Argumenten ist so häufig, dass es eine Abkürzung gibt: Statt seq(5,10)
kann man kurz 5:10
schreiben:
5:10
[1] 5 6 7 8 9 10
Hausaufgaben
(zum 30.10.)
Quadratische Gleichung
Wiederholen Sie nochmal die [Aufgabe zur quadratischen Gleichung @AufgQuGl] von oben
Mittelwert “per Hand”
Die Funktion sum
addiert alle Elemente eines Vektors auf und liefert ihre Summe. Den Mittelwert berechnet man bekanntlich, indem man die Summe durch die Anzahl der Werte teilt. Berechnen Sie den Mittelwert von v
auf zwei Wege: zum einen mittels mean
, zum anderen mittels sum
und length
.
“kleiner Gauß”
Was ist die Summer der ganzen Zahlen von 1 bis 100?
Standardabweichung per Hand
Die Stichproben-Varianz wird bekanntlich wie folgt berechnet:
\[ v = \frac{1}{n-1}\sum_{i=1}^n \left( x_i - \overline x \right)^2 \] Hier ist \(\overline x\) der Mittelwert der Einzelwerte \(x_i\) und \(n\) die Anzahl der Einzelwerte.
Berechnen Sie die Stichprobenvarianz von v
mit dieser Formel. Bestimmen Sie also erst den Mittelwert \(\overline x\), ziehen Sie ihn von allen Einzelwerten ab, quadrieren Sie die so erhaltenen Werte, und addieren Sie alle diese Quadrate. Teilen Sie schließlich die Summe durch \(n-1\). Bauen Sie diese Formel schritt für Schritt, von innen nach außen, auf, und testen Sie jeden Schritt, bevor Sie den nächsten vornehmen.
Vergleichen Sie mit dem Ergebnis der var
-Funktion.
Sinuskurve
Erzeugen Sie einen Vektor x
mit Zahlen von 0 bis 10 in Schritten zu je 0.1. Berechnen Sie dann y <- sin(x)
. Was finden Sie dann in y? Mit plot( x, y )
können Sie es schnell heraus finden.
Abgabe
Stellen Sie den R-Code zu den Aufgaben in einer Datei zusammen und laden Sie diese auf Moodle hoch.
Installation Tidyverse
Bitte installieren bis zur nächsten Vorlesung die Tidyverse-Pakete für R. Dazu brauchen Sie nur
install.packages( "tidyverse" )
in der RStudio-Konsole einzugeben. Allerdings braucht die Installation ca. 5-10 Minuten, daher sollten Sie das vor der nächsten Vorlesung erledigt haben.
Die Vorlesung am 23.10. endete hier. Der Rest kommt nächste Woche.
Tabellen
Für diesen Abschnitt verwenden wir ein Beispiel auf Irizarrys Buch.
Wir laden dazu das Paket “dslab”, dass die Beispieldaten aus dem Buch enthält.
library( dslabs )
Denken Sie daran, dass Sie das Paket mit install.packages("dslabs")
installieren müssen, bevor Sie es zum ersten Mal laden können.
Dieses Paket enthält eine Variable namens murders
. Wir lassen uns anzeigen, was sie enthält:
murders
state abb region population total
1 Alabama AL South 4779736 135
2 Alaska AK West 710231 19
3 Arizona AZ West 6392017 232
4 Arkansas AR South 2915918 93
5 California CA West 37253956 1257
6 Colorado CO West 5029196 65
7 Connecticut CT Northeast 3574097 97
8 Delaware DE South 897934 38
9 District of Columbia DC South 601723 99
10 Florida FL South 19687653 669
11 Georgia GA South 9920000 376
12 Hawaii HI West 1360301 7
13 Idaho ID West 1567582 12
14 Illinois IL North Central 12830632 364
15 Indiana IN North Central 6483802 142
16 Iowa IA North Central 3046355 21
17 Kansas KS North Central 2853118 63
18 Kentucky KY South 4339367 116
19 Louisiana LA South 4533372 351
20 Maine ME Northeast 1328361 11
21 Maryland MD South 5773552 293
22 Massachusetts MA Northeast 6547629 118
23 Michigan MI North Central 9883640 413
24 Minnesota MN North Central 5303925 53
25 Mississippi MS South 2967297 120
26 Missouri MO North Central 5988927 321
27 Montana MT West 989415 12
28 Nebraska NE North Central 1826341 32
29 Nevada NV West 2700551 84
30 New Hampshire NH Northeast 1316470 5
31 New Jersey NJ Northeast 8791894 246
32 New Mexico NM West 2059179 67
33 New York NY Northeast 19378102 517
34 North Carolina NC South 9535483 286
35 North Dakota ND North Central 672591 4
36 Ohio OH North Central 11536504 310
37 Oklahoma OK South 3751351 111
38 Oregon OR West 3831074 36
39 Pennsylvania PA Northeast 12702379 457
40 Rhode Island RI Northeast 1052567 16
41 South Carolina SC South 4625364 207
42 South Dakota SD North Central 814180 8
43 Tennessee TN South 6346105 219
44 Texas TX South 25145561 805
45 Utah UT West 2763885 22
46 Vermont VT Northeast 625741 2
47 Virginia VA South 8001024 250
48 Washington WA West 6724540 93
49 West Virginia WV South 1852994 27
50 Wisconsin WI North Central 5686986 97
51 Wyoming WY West 563626 5
Mit ?murders
können wir die zugehörige Hilfeseite aufrufen und erfahren so, dass es sich um eine Tabelle mit der Anzahl an durch Feuerwaffen verübte Morde im Jahr 2010 handelt, aufgeschlüsselt nach Staaten in den USA.
Der Typ dieser Variable is “data.frame”:
class(murders)
[1] "data.frame"
“Data frame” ist R’s Weg, Tabellen zu speichern, nämlich als eine Liste von Vektoren. Jeder Vektor stellt eine Spalte der Tabelle dar. Wir können auf die einzelnen Vektoren zugreifen, indem wir den Spaltennamen hinter den Variablennamen stellen, getrennt durch ein Dollarzeichen ($
):
Hier die erste Spalte:
$state murders
[1] "Alabama" "Alaska" "Arizona"
[4] "Arkansas" "California" "Colorado"
[7] "Connecticut" "Delaware" "District of Columbia"
[10] "Florida" "Georgia" "Hawaii"
[13] "Idaho" "Illinois" "Indiana"
[16] "Iowa" "Kansas" "Kentucky"
[19] "Louisiana" "Maine" "Maryland"
[22] "Massachusetts" "Michigan" "Minnesota"
[25] "Mississippi" "Missouri" "Montana"
[28] "Nebraska" "Nevada" "New Hampshire"
[31] "New Jersey" "New Mexico" "New York"
[34] "North Carolina" "North Dakota" "Ohio"
[37] "Oklahoma" "Oregon" "Pennsylvania"
[40] "Rhode Island" "South Carolina" "South Dakota"
[43] "Tennessee" "Texas" "Utah"
[46] "Vermont" "Virginia" "Washington"
[49] "West Virginia" "Wisconsin" "Wyoming"
Wir können die Spalte mit der Anzahl der Mordfälle (total
) durch die Bevölkerung (population
) des jeweiligen Staates teilen:
$total / murders$population murders
[1] 2.824424e-05 2.675186e-05 3.629527e-05 3.189390e-05 3.374138e-05
[6] 1.292453e-05 2.713972e-05 4.231937e-05 1.645275e-04 3.398069e-05
[11] 3.790323e-05 5.145920e-06 7.655102e-06 2.836961e-05 2.190073e-05
[16] 6.893484e-06 2.208111e-05 2.673201e-05 7.742581e-05 8.280881e-06
[21] 5.074866e-05 1.802179e-05 4.178622e-05 9.992600e-06 4.044085e-05
[26] 5.359892e-05 1.212838e-05 1.752137e-05 3.110476e-05 3.798036e-06
[31] 2.798032e-05 3.253724e-05 2.667960e-05 2.999324e-05 5.947151e-06
[36] 2.687123e-05 2.958934e-05 9.396843e-06 3.597751e-05 1.520093e-05
[41] 4.475323e-05 9.825837e-06 3.450936e-05 3.201360e-05 7.959810e-06
[46] 3.196211e-06 3.124600e-05 1.382994e-05 1.457101e-05 1.705649e-05
[51] 8.871131e-06
Nun haben wir die Mordrate per capita. Wir multiplizieren mit 1.000.000 (oder 1e6
), um die Mordrate pro 1 Million Einwohner zu erhalten:
$total / murders$population * 1e6 murders
[1] 28.244238 26.751860 36.295273 31.893901 33.741383 12.924531
[7] 27.139722 42.319369 164.527532 33.980688 37.903226 5.145920
[13] 7.655102 28.369608 21.900730 6.893484 22.081106 26.732010
[19] 77.425810 8.280881 50.748655 18.021791 41.786225 9.992600
[25] 40.440846 53.598917 12.128379 17.521372 31.104763 3.798036
[31] 27.980319 32.537239 26.679599 29.993237 5.947151 26.871225
[37] 29.589340 9.396843 35.977513 15.200933 44.753235 9.825837
[43] 34.509357 32.013603 7.959810 3.196211 31.246001 13.829942
[49] 14.571013 17.056487 8.871131
Das fügen wir nun als neue Spalte murders_per_million
hinzu:
$murders_per_million <- murders$total / murders$population * 1e6 murders
Hier ist unsere neue Tabelle:
murders
state abb region population total murders_per_million
1 Alabama AL South 4779736 135 28.244238
2 Alaska AK West 710231 19 26.751860
3 Arizona AZ West 6392017 232 36.295273
4 Arkansas AR South 2915918 93 31.893901
5 California CA West 37253956 1257 33.741383
6 Colorado CO West 5029196 65 12.924531
7 Connecticut CT Northeast 3574097 97 27.139722
8 Delaware DE South 897934 38 42.319369
9 District of Columbia DC South 601723 99 164.527532
10 Florida FL South 19687653 669 33.980688
11 Georgia GA South 9920000 376 37.903226
12 Hawaii HI West 1360301 7 5.145920
13 Idaho ID West 1567582 12 7.655102
14 Illinois IL North Central 12830632 364 28.369608
15 Indiana IN North Central 6483802 142 21.900730
16 Iowa IA North Central 3046355 21 6.893484
17 Kansas KS North Central 2853118 63 22.081106
18 Kentucky KY South 4339367 116 26.732010
19 Louisiana LA South 4533372 351 77.425810
20 Maine ME Northeast 1328361 11 8.280881
21 Maryland MD South 5773552 293 50.748655
22 Massachusetts MA Northeast 6547629 118 18.021791
23 Michigan MI North Central 9883640 413 41.786225
24 Minnesota MN North Central 5303925 53 9.992600
25 Mississippi MS South 2967297 120 40.440846
26 Missouri MO North Central 5988927 321 53.598917
27 Montana MT West 989415 12 12.128379
28 Nebraska NE North Central 1826341 32 17.521372
29 Nevada NV West 2700551 84 31.104763
30 New Hampshire NH Northeast 1316470 5 3.798036
31 New Jersey NJ Northeast 8791894 246 27.980319
32 New Mexico NM West 2059179 67 32.537239
33 New York NY Northeast 19378102 517 26.679599
34 North Carolina NC South 9535483 286 29.993237
35 North Dakota ND North Central 672591 4 5.947151
36 Ohio OH North Central 11536504 310 26.871225
37 Oklahoma OK South 3751351 111 29.589340
38 Oregon OR West 3831074 36 9.396843
39 Pennsylvania PA Northeast 12702379 457 35.977513
40 Rhode Island RI Northeast 1052567 16 15.200933
41 South Carolina SC South 4625364 207 44.753235
42 South Dakota SD North Central 814180 8 9.825837
43 Tennessee TN South 6346105 219 34.509357
44 Texas TX South 25145561 805 32.013603
45 Utah UT West 2763885 22 7.959810
46 Vermont VT Northeast 625741 2 3.196211
47 Virginia VA South 8001024 250 31.246001
48 Washington WA West 6724540 93 13.829942
49 West Virginia WV South 1852994 27 14.571013
50 Wisconsin WI North Central 5686986 97 17.056487
51 Wyoming WY West 563626 5 8.871131
Aufgaben
Runden
Verschönern Sie die eben erstellte Tabelle mit der Mordstatistik, in dem Sie die Werte in der neuen Spalte murders_per_million
auf eine Nachkommestelle runden. (Erinnern Sie sich an die wieter oben eingeführte Funktion round
.)
Abspeichern
Speichern Sie die Tabelle mit der Mordstatistik in eine Datei ab, indem Sie die Funktion write.csv
benutzen, z.B. so: write.csv( murders, "murders.csv" )
. Sie sollten dann auf Ihrer Festplatte eine Datei mit Namen murders.csv
finden. Laden Sie diese in Excel (oder einem anderen Tabellenkalkulationsprogramm).
Plotten
Verwenden Sie die nochmals die Funktion plot
. Übergeben Sie zunächst die Tabellenspalte mit der Einwohnerzahl als erstes Argument (x-Werte) und die Spalte mit der Anzal der Morde (total
) als y-Achse.
Wie ändert sich der Plot, wenn Sie die Mord-Rate (Morde pro Million Einwohner) statt der Mord-Anzahl verwenden?
Welcher “Staat” sticht dann hervor? Wo ist die Mordrate am höchsten? Können Sie das erklären?
Ergänzen Sie im Aufruf der
plot
-Funktion als drittes Argument hinzu:log="x"
. Was ändert sich? Ist das nützlich?
R-Skript
Erstellen Sie ein R-Skript, dass die R-Anweisungen für die vorstehenden Aufgaben enthält. Das Skript sollte also die Mordstatstik-Tabelle laden, die Spalte mit der Mordrate hinzufügen und dann einen der Plots erstellen. Speichen Sie das Skript ab.
Wählen Sie im Menü “Session” von RStudio erst die Menü-Funktion “Clear Workspace” und dann die Funktion “Restart R” aus. Damit wird R in den Auusgangszustand zurückversetzt. Führen Sie alle Zeilemn Ihres Skripts aus, um sich zu überzeugen, dass noch alles funkioniert und nichts fehlt.
Bitte laden sie die Datei mit dem Skript auf Moodle hoch.