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:

a <- 7

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:

a <- 10

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:

a <- 10

ist dasselbe wie

10 -> a

Als dritte Möglichkeit kann man auch

a = 10

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:

a <- 3
b <- 5
c <- -3

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:

ein_langer_name <- 15

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 und 3)
  • 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 Literal 2 und die Variable a und der Additions-Operator + verknüpft die Teilausdrücke 2*a und sqrt(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:

a <- 3 < 7
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):

s <- "hello"
class(s)
[1] "character"

Eine Zeichenkette muss stets in Anführunsgzeichen (double quotes, "...") gesetzt werden.

Wenn man

s <- hello

schreibt, denkt R, dass man eine Variable mit dem Namen hello meint und beschwert sich, dass diese nicht definiert wurde.

Vergleichen Sie

ss <- "a"
ss
[1] "a"
ss <- a
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

Daten kommen selten allein. Mit der Funktion c (für “concatenate”) können wir mehrere Werte (desselben Datentyps) zu einem sog. “Vektor” zusammenstellen:
v <- c( 3, 5, 2, 7, -1, 2.5, 3 )

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):

v[4]
[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:

v+1
[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:

v > 3
[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:

w <- seq(7)
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:

v + w
[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:

murders$state
 [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:

murders$total / murders$population
 [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:

murders$total / murders$population * 1e6
 [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$murders_per_million <- murders$total / murders$population * 1e6

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.