RStudio Indexierung

R bietet eine leistungsfähige und bequeme Möglichkeit zur Indizierung von Vektoren. Wir können zum Beispiel einen Vektor auf der Grundlage von Eigenschaften eines anderen Vektors unterteilen. In diesem Abschnitt arbeiten wir weiter mit unserem Beispiel der US-Morde, das wir wie folgt laden können:

library(dslabs)
data("murders")

Unterteilung mit logischen Operationen

Wir haben nun die Mordrate wie folgt berechnet:

murder_rate <- murders$total / murders$population * 100000 

Stellen Sie sich vor, Sie ziehen aus Italien weg, wo die Mordrate laut einem ABC-Nachrichtenbericht nur 0,71 pro 100.000 Einwohner beträgt. Sie würden es vorziehen, in einen Staat mit einer ähnlichen Mordrate zu ziehen. Eine weitere leistungsstarke Funktion von R ist die Verwendung von Logicals zur Indizierung von Vektoren. Wenn wir einen Vektor mit einer einzelnen Zahl vergleichen, wird der Test tatsächlich für jeden Eintrag durchgeführt. Das folgende Beispiel bezieht sich auf die obige Frage:

ind <- murder_rate < 0.71

Wenn wir stattdessen wissen wollen, ob ein Wert kleiner oder gleich ist, können wir verwenden:

ind <- murder_rate <= 0.71

Man beachte, dass wir einen logischen Vektor mit TRUE für jeden Eintrag, der kleiner oder gleich 0,71 ist, zurückbekommen. Um zu sehen, um welche Zustände es sich handelt, können wir die Tatsache nutzen, dass Vektoren mit Logicals indiziert werden können.

murders$state[ind]
#> [1] "Hawaii"        "Iowa"          "New Hampshire" "North Dakota" 
#> [5] "Vermont"

Um zu zählen, wie viele davon TRUE sind, gibt die Funktion sum die Summe der Einträge eines Vektors zurück, und logische Vektoren werden in numerische Werte umgewandelt, wobei TRUE als 1 und FALSE als 0 kodiert wird. So können wir die Staaten zählen, indem wir:

sum(ind)
#> [1] 5

Logische Operatoren

True und False

Angenommen, wir mögen die Berge und wollen in einen sicheren Staat im Westen des Landes ziehen. Wir wollen, dass die Mordrate höchstens 1 beträgt. In diesem Fall wollen wir, dass zwei verschiedene Dinge wahr sind. Hier können wir den logischen Operator und verwenden, der in R mit & dargestellt wird. Diese Operation führt nur dann zu TRUE, wenn beide logischen Operatoren TRUE sind. Um dies zu sehen, betrachten Sie dieses Beispiel:

TRUE & TRUE
#> [1] TRUE
TRUE & FALSE
#> [1] FALSE
FALSE & FALSE
#> [1] FALSE

Für unser Beispiel können wir zwei Logicals bilden:

west <- murders$region == "West"
safe <- murder_rate <= 1

und wir können das & verwenden, um einen Vektor von Logicals zu erhalten, der uns sagt, welche Zustände beide Bedingungen erfüllen:

ind <- safe & west
murders$state[ind]
#> [1] "Hawaii"  "Idaho"   "Oregon"  "Utah"    "Wyoming"

Which

Nehmen wir an, wir wollen die Mordrate in Kalifornien abfragen. Für diese Art von Operation ist es praktisch, Vektoren von Logicals in Indizes umzuwandeln, anstatt lange Vektoren von Logicals zu behalten. Die Funktion, die uns sagt, welche Einträge eines logischen Vektors TRUE sind. Wir können also tippen:

ind <- which(murders$state == "California")
murder_rate[ind]
#> [1] 3.37

match

Wenn wir statt nur eines Staates die Mordraten für mehrere Staaten, z. B. New York, Florida und Texas, herausfinden wollen, können wir die Funktion match verwenden. Diese Funktion sagt uns, welche Indizes eines zweiten Vektors mit jedem der Einträge eines ersten Vektors übereinstimmen:

ind <- match(c("New York", "Florida", "Texas"), murders$state)
ind
#> [1] 33 10 44

Jetzt können wir uns die Mordraten ansehen:

murder_rate[ind]
#> [1] 2.67 3.40 3.20

%in%

Wenn wir anstelle eines Indexes eine logische Funktion benötigen, die uns sagt, ob jedes Element eines ersten Vektors in einem zweiten enthalten ist oder nicht, können wir die Funktion %in% verwenden. Nehmen wir an, Sie sind sich nicht sicher, ob Boston, Dakota und Washington Staaten sind. Sie können das auf diese Weise herausfinden:

c("Boston", "Dakota", "Washington") %in% murders$state
#> [1] FALSE FALSE  TRUE

Beachten Sie, dass wir %in% im Laufe des Buches häufig verwenden werden.

Fortgeschrittene: Es gibt eine Verbindung zwischen match und %in% durch welche. Um dies zu sehen, beachten Sie, dass die folgenden zwei Zeilen denselben Index erzeugen (wenn auch in unterschiedlicher Reihenfolge):

match(c("New York", "Florida", "Texas"), murders$state)
#> [1] 33 10 44
which(murders$state%in%c("New York", "Florida", "Texas"))
#> [1] 10 33 44

Übungen

Übung 1

# Store the 3 abbreviations in a vector called `abbs` (remember that they are character vectors and need quotes)
abbs <- c("AK", "MI", "IA")

# Match the abbs to the murders$abb and store in ind
ind <- match(abbs,murders$abb)

# Print state names from ind
murders$state[ind]

Übung 2

# Store the 5 abbreviations in `abbs`. (remember that they are character vectors)
abbs <- c("MA", "ME", "MI", "MO", "MU")

# Use the %in% command to check if the entries of abbs are abbreviations in the the murders data frame
abbs %in% murders$abb

# Use the `which` command and `!` operator to find out which index abbreviations are not actually part of the dataset and store in `ind`
#ind <- !abbs%in%murders$abb
ind <- which(!abbs%in%murders$abb)
ind

# Names of abbreviations in `ind`
abbs[ind]

Beispiel Fragen und Antworten

Für diese Fragen benötigen wir den Höhendatensatz, der im Paket dslabs enthalten ist. Rufen wir die Bibliothek auf, bereiten die Daten vor und setzen die Dezimalpunkte für den Rest der Analysen. Der Datensatz besteht aus den Spalten Geschlecht (sex) und Höhe (height).

library(dslabs)
data(heights)
head(heights) # hier sehen wir, welche Einträge der Datensatz hat.
summary(heights) # gibt uns eine Übersicht 

Frage 1: Bestimmen Sie zunächst die durchschnittliche Körpergröße in diesem Datensatz. Erstellen Sie dann einen logischen Vektor ind* mit den Indizes für die Personen, die über der Durchschnittsgröße liegen. Wie viele Personen im Datensatz sind überdurchschnittlich groß?

# calculating the average height of the sample
average_height <- mean(heights$height)
#indexing the data for the individuals who are higher than average height
ind <- heights$height > average_height
# heights$height[ind] #Gives all the heights higher than average. I don't want to make my paper messy. 
sum(ind)

Antwort: 532

Frage 2: Wie viele Personen im Datensatz sind überdurchschnittlich groß und weiblich?

# Variable female_pop fasst alle Frauen zusammen
female_pop <- heights$sex == "Female"
taller_female <- heights$height > mean(heights$height)
# calculating above average tall females
indexf<- female_pop & taller_female
sum(indexf)

Antwort: 31

Frage 3: Wenn Sie mean() auf einen logischen (TRUE/FALSE) Vektor anwenden, gibt es den Anteil der Beobachtungen zurück, die TRUE sind. Welcher Anteil der Personen im Datensatz ist weiblich?

mean(heights$sex == "Female")

Antwort: 0,227 bzw. 22,7%

Frage 4: Ermitteln Sie die Mindesthöhe und die maximal Höhe im Datensatz Höhen.

min(heights$height)
max(heights$height)

Antwort 50 inches und 82,7 inches

Frage 4: Verwenden Sie die Funktion match(), um den Index des ersten Individuums mit der geringsten Höhe zu ermitteln.

match(50,heights$height)

Antwort: 1032