RStudio Datentypen in R Sortieren

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ägesort()order()rank()
31423
41531
153112
926555
659244

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)