Datentypen
Variablen in R können von unterschiedlichem Typ sein. Zum Beispiel müssen wir Zahlen von Zeichenketten und Tabellen von einfachen Zahlenlisten unterscheiden. Die Funktion class() hilft uns zu bestimmen, um welchen Objekttyp es sich handelt:
a <- 10 class(a) # Ausgabe> [1] "numeric"
Um effizient in R arbeiten zu können, ist es wichtig, die verschiedenen Variablentypen zu kennen und zu wissen, was man mit ihnen machen kann. Um auf Daten aus den Spalten eines Datenrahmens zuzugreifen, verwenden wir das Dollarzeichen-Symbol $, das als Accessor bezeichnet wird.
Ein Vektor ist ein Objekt, das aus mehreren Einträgen besteht und ein numerischer Vektor, ein Zeichenvektor oder ein logischer Vektor sein kann.
Wir verwenden Anführungszeichen, um zwischen Variablennamen und Zeichenketten zu unterscheiden.
Faktoren sind nützlich für die Speicherung kategorischer Daten und sind speichereffizienter als die Speicherung von Zeichen.
Dataframes in R
Bis jetzt haben wir die Variablen nur als eine Zahl definiert. Dies ist für die Speicherung von Daten nicht sehr nützlich. Die gängigste Art, einen Datensatz in R zu speichern, ist ein Datenrahmen. Konzeptionell kann man sich einen Datenrahmen als eine Tabelle vorstellen, in der die Zeilen die Beobachtungen darstellen und die verschiedenen Variablen, die für jede Beobachtung gemeldet werden, die Spalten definieren. Datenrahmen sind besonders nützlich für Datensätze, da wir verschiedene Datentypen in einem Objekt kombinieren können.
Ein großer Teil der Herausforderungen bei der Datenanalyse beginnt mit Daten, die in einem Datenrahmen gespeichert sind. So haben wir beispielsweise die Daten für unser motivierendes Beispiel in einem Datenrahmen gespeichert. Sie können auf diesen Datensatz zugreifen, indem Sie die dslabs-Bibliothek laden und den Morddatensatz mit der Datenfunktion laden:
library(dslabs) data(trump_tweets) #mit der Funktion class() stellen wir fest, ob es sich tatsächlich um einen Dataframe handelt. class(trump_tweets) #> [1] "data.frame" #Die Ausgabe ergibt "data.frame". Damit wurde unsere Annahme bestätigt.
In dieser Anleitung picken wir uns den Datensatz trump_tweets aus dem Paket dslabs heraus.
Untersuchen eines Objekts
Ein Dataframe kann sehr komplex sein, weil zahlreiche Variablen mit unterschiedlichen Eigenschaften sich darin befinden können. Damit wir einen Dataframe schnell verstehen, gibt es die Funktion str(). Sie hilft uns, mehr über die Struktur eines Objekts herauszufinden:
str(trump_tweets) #Das ist die Ausgabe: #'data.frame': 20761 obs. of 8 variables: # $ source : chr "Twitter Web Client" "Twitter Web Client" "Twitter Web Client" "Twitter Web Client" ... # $ id_str : chr "6971079756" "6312794445" "6090839867" "5775731054" ... # $ text : chr "From Donald Trump: Wishing everyone a wonderful holiday & a happy, healthy, prosperous New Year. Let’s think li"| __truncated__ "Trump #International Tower in Chicago ranked 6th tallest building in world by Council on Tall Buildings & Urban "| __truncated__ "Wishing you and yours a very Happy and Bountiful #Thanksgiving!" "Donald Trump Partners with TV1 on New Reality Series Entitled, Omarosa's Ultimate Merger: http://tinyurl.com/yk5m3lc" ... # $ created_at : POSIXct, format: "2009-12-23 12:38:18" "2009-12-03 14:39:09" "2009-11-26 14:55:38" ... # $ retweet_count : int 28 33 13 5 7 4 2 4 1 22 ... # $ in_reply_to_user_id_str: chr NA NA NA NA ... # $ favorite_count : int 12 6 11 3 6 5 2 10 4 30 ... # $ is_retweet : logi FALSE FALSE FALSE FALSE FALSE FALSE ...
Wir sehen eine Übersicht der Variablen des Dataframes. Oben werden die Anzahl der Fälle (Zeilen) und die Anzahl der Variablen (Spalten) aufgelistet. Wir sehen, dass die Tabelle 20761 Zeilen (Messpunkte) und 8 Variablen aufweist. Wir können die ersten sechs Zeilen mit der Funktion head() anzeigen:
head(trump_tweets) # source id_str #1 Twitter Web Client 6971079756 #2 Twitter Web Client 6312794445 #3 Twitter Web Client 6090839867 #4 Twitter Web Client 5775731054 #5 Twitter Web Client 5364614040 #6 Twitter Web Client 5203117820 text #1 From Donald Trump: Wishing everyone a wonderful holiday & a happy, healthy, prosperous New Year. Let’s think like champions in 2010! #2 Trump International Tower in Chicago ranked 6th tallest building in world by Council on Tall Buildings & Urban Habitat http://bit.ly/sqvQq #3 Wishing you and yours a very Happy and Bountiful Thanksgiving! #4 Donald Trump Partners with TV1 on New Reality Series Entitled, Omarosa's Ultimate Merger: http://tinyurl.com/yk5m3lc #5 --Work has begun, ahead of schedule, to build the greatest golf course in history: Trump International – Scotland. #6 --From Donald Trump: "Ivanka and Jared’s wedding was spectacular, and they make a beautiful couple. I’m a very proud father." created_at retweet_count in_reply_to_user_id_str favorite_count is_retweet #1 2009-12-23 12:38:18 28 <NA> 12 FALSE #2 2009-12-03 14:39:09 33 <NA> 6 FALSE #3 2009-11-26 14:55:38 13 <NA> 11 FALSE #4 2009-11-16 16:06:10 5 <NA> 3 FALSE #5 2009-11-02 09:57:56 7 <NA> 6 FALSE #6 2009-10-27 10:31:48 4 <NA> 5 FALSE
Die head() Funktion zeigt uns die ersten Zeilen in einem Datensatz für alle Variablen. Die obere Ansicht ist deshalb gekürzt. Wenn du einen neuen Datensatz erhälst, solltest du mit den vorgestellten Funktionen einen schnellen Überblick zum Dataframe einholen.
In unserem Beispiel ist ein Messpunkt (Case, Observation) eine gesendete Nachricht. Für jede gesendete Nachricht kennen wir die Quelle (Source), eine einzigartige ID Nummer (id_str) den Inhalt der Nachricht (text) und weitere Informationen.
Zugriff mit $
In unseren Analysen werden wir nicht nur auf den Dataframe als Ganzes, sondern auch direkt auf einzelne Variablen zugreifen müssen. Wenn wir einzelne Variablen bzw. Spalten aus unserem Datensatz verwenden möchten, nutzen wir den Zugriffsoperator $ auf die folgende Weise:
> trump_tweets$retweet_count # [1] 28 33 13 5 7 4 2 4 1 22 7 5 1 1 1 11 28 22 2 1 3 # [22] 1 34 4 4 1 11 38 6 2 1 9 1 10 2 4 1 11 10 8 3 2 #[43] 253 144 109 112 250 12 14 24 44 55 24 31 69 32 19 26 27 34 28 37 34 #[64] 35 27 31 46 36 21 24 31 15 100 34 43 17 51 15 47 38 21 11 21 16 #[85] 46 44 17 39 193 50 43 56 54 9 17 7 9 8 38 24 30 22 15 33 16 #[106] 74 5 4 5 78 39 22 26 18 30 22 13 17 15 19 16 11 8 7 6 8 #[127] 25 18 8 24 37 10 12 18 9 10 45 7 15 12 18 117 13 36 6 8 10 #[148] 14 21 12 59 25 19 3257 66 8 49 9 10 10 13 8 3 8 19 12 46 13 #[169] 9 45 13 23 23 7 25 16 7 16 12 3813 23 20 187 174 1234 470 1012 217 59 #[190] 440 257 41 243 157 120 745 24 3 128 109 381 214 622 164 246 80 111 138 171 160 #[211] 96 42 99 21 13689 27 200 78 10 3069 31 27 144 22 285 430 252 26 19 307 380 #[232] 208 55 196 630 23 17 170 228 36 24 12 20 384 38 15 145 68 325 62 106 29 # Die Tabelle ist ab hier gekürzt.
Um zu sehen, welche Variablennamen in einem Datensatz vorhanden sind, können wir Funktion names() verwenden.
names(trump_tweets) #[1] "source" "id_str" "text" "created_at" "retweet_count" #[6] "in_reply_to_user_id_str" "favorite_count" "is_retweet"
Wichtig: R Studio ändern die Reihenfolgen der Einträge nicht. Wenn wir direkt auf eine Variable zugreifen, z. B. mit trump_tweets$created_at , bleibt die Reihenfolge der Zeilen unverändert. Das hat den Vorteil, dass wir Variablen manipulieren können und neu ordnen können, ohne das Chaos entsteht.
Vektoren: Ziffern, Zeichen und Logik
Das Objekt trump_tweets$retweet_count ist nicht eine Zahl, sondern eine Sammlung von mehreren Zahlen. Wir nennen diese Art von Objekten Vektoren. Eine einzelne Zahl ist technisch gesehen ein Vektor der Länge 1, aber im Allgemeinen verwenden wir den Begriff Vektoren, um Objekte mit mehreren Einträgen zu bezeichnen. Die Funktion length() gibt an, wie viele Einträge der Vektor hat:
retweet <- trump_tweets$retweet_count length(retweet) #> [1] 20761
Dieser besondere Vektor ist numerisch, da dieser ausschließlich Zahlen beinhaltet. Das überprüfen wir mit der Funktion class().
class(retweet) #> [1] "numeric"
In einem numerischen Vektor muss jeder Eintrag eine Zahl sein.
Um Zeichenketten zu speichern, können Vektoren auch von der Klasse „character“ sein. Zum Beispiel sind die Zustandsnamen Zeichen:
class(trump_tweets$source) #> [1] "character"
Wie bei numerischen Vektoren müssen alle Einträge in einem Zeichenvektor ein Zeichen sein.
Eine weitere wichtige Art von Vektoren sind logische Vektoren. Diese müssen entweder TRUE oder FALSE sein.
x <- 100 == 2 x #> [1] FALSE class(x) #> [1] "logical"
Hier ist das == ein relationaler Operator, der fragt, ob 100 gleich 2 ist. Wenn Sie in R nur ein Gleichheitszeichen = verwenden, weisen Sie tatsächlich eine Variable zu, aber wenn Sie zwei == verwenden, testen Sie auf Gleichheit.
Sie können die anderen relationalen Operatoren sehen, indem Sie eingeben:
?Comparison