Zusammenfassung
- Die Funktion sort() sortiert einen Vektor in aufsteigender Reihenfolge.
- Die Funktion order() liefert die Indizes, die benötigt werden, um den sortierten Vektor zu erhalten, z. B. bedeutet ein Ergebnis von 2 3 1 5 4, dass der sortierte Vektor durch Auflistung des zweiten, dritten, ersten, fünften und dann vierten Elements des ursprünglichen Vektors erzeugt wird.
- Die Funktion rank() gibt die Ränge der Elemente im ursprünglichen Vektor an.
- Die Funktion max() gibt den größten Wert zurück, während which.max() den Index des größten Wertes zurückgibt. Die Funktionen min() und which.min() funktionieren ähnlich für Mindestwerte.
Sortieren
Nehmen wir an, wir wollen die Staaten von den wenigsten bis zu den meisten Morden mit Schusswaffen ordnen. Die Funktion sort() sortiert einen Vektor in aufsteigender Reihenfolge. Wir können also die größte Anzahl von Waffenmorden sehen, indem wir tippen:
library(dslabs)
data(murders)
sort(murders$total)
#> [1] 2 4 5 5 7 8 11 12 12 16 19 21 22
#> [14] 27 32 36 38 53 63 65 67 84 93 93 97 97
#> [27] 99 111 116 118 120 135 142 207 219 232 246 250 286
#> [40] 293 310 321 351 364 376 413 457 517 669 805 1257
Dies gibt uns jedoch keine Auskunft darüber, welche Staaten welche Mordzahlen aufweisen. Wir wissen zum Beispiel nicht, welcher Staat 1257 hatte.
Sort Funktion
Die Funktion Ordnung entspricht eher dem, was wir wollen. Sie nimmt einen Vektor als Eingabe und gibt den Vektor der Indizes zurück, der den Eingabevektor sortiert. Das mag verwirrend klingen, also schauen wir uns ein einfaches Beispiel an. Wir können einen Vektor erstellen und ihn sortieren:
x <- c(31, 4, 15, 92, 65)
sort(x)
#> [1] 4 15 31 65 92
Anstatt den Eingangsvektor zu sortieren, gibt die Funktion order() den Index zurück, der den Eingangsvektor sortiert:
index <- order(x)
x[index]
#> [1] 4 15 31 65 92
Dies ist die gleiche Ausgabe wie die, die Funktion sort() liefert. Wenn wir uns diesen Index ansehen, sehen wir, warum er funktioniert:
x
#> [1] 31 4 15 92 65
order(x)
#> [1] 2 3 1 5 4
Der zweite Eintrag von x ist der kleinste, also beginnt order() mit 2. Der nächstkleinere ist der dritte Eintrag, also ist der zweite Eintrag 3 und so weiter.
Wie hilft uns das, die Staaten nach Morden zu ordnen? Erinnern Sie sich zunächst daran, dass die Einträge der Vektoren, auf die Sie mit $ zugreifen, die gleiche Reihenfolge haben wie die Zeilen in der Tabelle. Die beiden Vektoren, die die Namen der Staaten bzw. die Abkürzungen der Staaten enthalten, sind in der Reihenfolge übereinstimmend:
murders$state[1:6]
#> [1] "Alabama" "Alaska" "Arizona" "Arkansas" "California"
#> [6] "Colorado"
murders$abb[1:6]
#> [1] "AL" "AK" "AZ" "AR" "CA" "CO"
Das bedeutet, dass wir die Staatsnamen nach der Gesamtzahl der Morde ordnen können. Wir erhalten zunächst den Index, der die Vektoren nach der Gesamtzahl der Morde ordnet, und indexieren dann den Vektor der Staatsnamen:
ind <- order(murders$total)
murders$abb[ind]
#> [1] "VT" "ND" "NH" "WY" "HI" "SD" "ME" "ID" "MT" "RI" "AK" "IA" "UT"
#> [14] "WV" "NE" "OR" "DE" "MN" "KS" "CO" "NM" "NV" "AR" "WA" "CT" "WI"
#> [27] "DC" "OK" "KY" "MA" "MS" "AL" "IN" "SC" "TN" "AZ" "NJ" "VA" "NC"
#> [40] "MD" "OH" "MO" "LA" "IL" "GA" "MI" "PA" "NY" "FL" "TX" "CA"
Nach den obigen Angaben gab es in Kalifornien die meisten Morde.
Max und which.max Funktion
Wenn wir nur an dem Eintrag mit dem größten Wert interessiert sind, können wir für den Wert max() verwenden:
max(murders$total)
#> [1] 1257
und which.max() für den Index des größten Wertes:
i_max <- which.max(murders$total)
murders$state[i_max]
#> [1] "California"
Für das Minimum können wir min und which.min() auf die gleiche Weise verwenden.
Bedeutet dies, dass Kalifornien der gefährlichste Staat ist? In einem der nächsten Abschnitte werden wir argumentieren, dass wir Raten anstelle von Summen betrachten sollten. Zuvor führen wir noch eine letzte ordnungsbezogene Funktion ein: Rang.
Rank Funktion
Obwohl sie nicht so häufig verwendet wird wie order() und sort(), ist die Funktion rank() ebenfalls nützlich. Sie gibt für jeden beliebigen Vektor einen Vektor mit dem Rang des ersten Eintrags, des zweiten Eintrags usw. des Eingabevektors zurück. Hier ist ein einfaches Beispiel:
x <- c(31, 4, 15, 92, 65)
rank(x)
#> [1] 3 1 2 5 4
Betrachten wir zusammenfassend die Ergebnisse der drei vorgestellten Funktionen:
Originale Einträge | sort() | order() | rank() |
31 | 4 | 2 | 3 |
4 | 15 | 3 | 1 |
15 | 31 | 1 | 2 |
92 | 65 | 5 | 5 |
65 | 92 | 4 | 4 |
Zusammenfassung
library(dslabs)
data(murders)
sort(murders$total)
x <- c(31, 4, 15, 92, 65)
x
sort(x) # puts elements in order
index <- order(x) # returns index that will put x in order
x[index] # rearranging by this index puts elements in order
order(x)
murders$state[1:10]
murders$abb[1:10]
index <- order(murders$total)
murders$abb[index] # order abbreviations by total murders
max(murders$total) # highest number of total murders
i_max <- which.max(murders$total) # index with highest number of murders
murders$state[i_max] # state name with highest number of total murders
x <- c(31, 4, 15, 92, 65)
x
rank(x) # returns ranks (smallest to largest)
Übungen
# Access the `state` variable and store it in an object
states <- murders$state
# Sort the object alphabetically and redefine the object
states <- sort(states)
# Report the first alphabetical value
states[1]
# Access population values from the dataset and store it in pop
pop <- murders$pop
# Sort the object and save it in the same object
pop <- sort(pop)
# Report the smallest population size
pop[1]
## Übung 2
# Store temperatures in an object
temp <- c(35, 88, 42, 84, 81, 30)
# Store city names in an object
city <- c("Beijing", "Lagos", "Paris", "Rio de Janeiro", "San Juan", "Toronto")
# Create data frame with city names and temperature
city_temps <- data.frame(name = city, temperature = temp)
# Define a variable states to be the state names
states <- c(murders$state)
# Define a variable ranks to determine the population size ranks
ranks <- rank(murders$population)
# Create a data frame my_df with the state name and its rank
my_df <- data.frame(name=states, rankings = ranks)
## Übung 3
# Define a variable states to be the state names from the murders data frame
states <- murders$state
# Define a variable ranks to determine the population size ranks
ranks <- rank(murders$population)
# Define a variable ind to store the indexes needed to order the population values
ind <- order(ranks)
ind
# Create a data frame my_df with the state name and its rank and ordered from least populous to most
my_df <- data.frame( states=states[ind], ranks=ranks[ind])
## Übung 4
# Using new dataset
library(dslabs)
data(na_example)
# Checking the structure
str(na_example)
# Find out the mean of the entire dataset
mean(na_example)
# Use is.na to create a logical index ind that tells which entries are NA
ind <- is.na(na_example)
# Determine how many NA ind has using the sum function
sum(ind, NA, na.rm=TRUE)