Kapitel 1. R-Grundlagen

Diese Arbeit wurde mithilfe von KI übersetzt. Wir freuen uns über dein Feedback und deine Kommentare: translation-feedback@oreilly.com

In diesem Kapitel geht es um die Grundlagen: die Installation und Verwendung von Paketen und das Laden von Daten.

Für die meisten Rezepte in diesem Buch müssen die Pakete ggplot2, dplyr und gcookbook auf deinem Computer installiert sein. (Das gcookbook-Paket enthält die Datensätze, die in einigen der Beispiele verwendet werden, ist aber für die eigentliche Arbeit nicht notwendig.) Wenn du schnell loslegen willst, führe aus:

install.packages("tidyverse")
install.packages("gcookbook")

Dann kannst du in jeder R-Sitzung, bevor du die Beispiele in diesem Buch ausführst, mit laden:

library(tidyverse)
library(gcookbook)

Wenn du library(tidyverse) aufrufst, werden ggplot2, dplyr und eine Reihe anderer Pakete geladen. Wenn du deine R-Sitzung schlanker halten und nur die Pakete laden möchtest, die du unbedingt brauchst, kannst du die Pakete ggplot2 und dplyr einzeln laden:

library(ggplot2)
library(dplyr)
library(gcookbook)
Hinweis

Wenn du ein tieferes Verständnis für die Funktionsweise von ggplot2 haben möchtest, lies Anhang A, der die Konzepte hinter ggplot2 erklärt.

Pakete in R sind Sammlungen von Funktionen und/oder Daten, die zur einfachen Verteilung gebündelt werden. Die Installation eines Pakets erweitert die Funktionalität von R auf deinem Computer. Wenn ein R-Nutzer ein Paket erstellt und der Meinung ist, dass es für andere nützlich sein könnte, kann er es über ein Paket-Repository verbreiten. Das wichtigste Repository für die Verbreitung von R-Paketen heißt CRAN (Comprehensive R Archive Network), aber es gibt auch andere, wie z. B. Bioconductor, das sich auf Pakete für genomische Daten spezialisiert hat.

Wenn du viel Zeit damit verbracht hast, R zu lernen, hast du vielleicht schon vomtidyverse gehört. Dabei handelt es sich um eine Sammlung von R-Paketen, die gemeinsame Vorstellungen davon haben, wie Daten strukturiert und manipuliert werden sollten. Das Tidyverse ist eine Sammlung von R-Paketen, die gemeinsame Vorstellungen davon haben, wie Daten zu strukturieren und zu bearbeiten sind. DasTidyverse ist eine Sammlung von Zusatzpaketen für R, die viele Operationen zur Datenbearbeitung und -visualisierung erleichtern. In diesem Buch wird hauptsächlich Tidyverse verwendet, da ich der Meinung bin, dass es eine schnellere und einfachere (aber nicht weniger leistungsstarke!) Möglichkeit bietet, mit Daten zu arbeiten.

Wenn du noch nie mit tidyverse gearbeitet hast, solltest du vor allem ein Rezept lesen, das dir hilft, eine fremdartig aussehende Syntax zu verstehen: %>%, auch bekannt als Pipe-Operator. Das ist Rezept 1.7 in diesem Kapitel.

1.1 Ein Paket installieren

Problem

Du möchtest ein Paket von CRAN installieren.

Lösung

Verwende install.packages() und gib den Namen des Pakets an, das du installieren möchtest. Um ggplot2 zu installieren, führe aus:

install.packages("ggplot2")

An dieser Stelle wirst du möglicherweise aufgefordert, einen Download-Mirror auszuwählen. In der Regel ist es am besten, die erste Wahl, https://cloud.r-project.org/, zu verwenden, da es sich um einen Cloud-basierten Mirror mit Endpunkten auf der ganzen Welt handelt.

Diskussion

Wenn du mehrere Pakete auf einmal installieren willst, kannst du einen Vektor von Paketnamen übergeben. So werden zum Beispiel die meisten der in diesem Buch verwendeten Pakete installiert:

install.packages(c("tidyverse", "gcookbook"))

Wenn du R anweist, ein Paket zu installieren, installiert es automatisch alle anderen Pakete, von denen das erste Paket abhängt.

1.2 Ein Paket laden

Problem

Du willst ein installiertes Paket laden.

Lösung

Verwende library() und gib den Namen des Pakets an, das du installieren möchtest. Um ggplot2 zu laden, führe aus:

library(ggplot2)

Das Paket muss bereits auf dem Computer installiert sein.

Diskussion

Bei den meisten Rezepten in diesem Buch muss vor der Ausführung des Codes ein Paket geladen werden, entweder für die Grafikfunktionen (wie im ggplot2-Paket) oder für Beispieldatensätze (wie in den Paketen MASS und gcookbook).

Eine der Eigenheiten von R ist die Terminologie "Paket/Bibliothek". Obwohl du die Funktion library() verwendest, um ein Paket zu laden, ist ein Paket keine Bibliothek, und einige langjährige R-Nutzer werden wütend, wenn du es so nennst.

Eine Bibliothek ist ein Verzeichnis, das eine Reihe von Paketen enthält. Du könntest z. B. eine systemweite Bibliothek und eine Bibliothek für jeden Benutzer haben.

1.3 Pakete upgraden

Problem

Du willst ein Paket aktualisieren, das bereits installiert ist.

Lösung

Führe update.packages() aus:

update.packages()

Es wird dich nach jedem Paket fragen, das aktualisiert werden kann. Wenn du möchtest, dass alle Pakete ohne Nachfrage aktualisiert werden, verwende ask = FALSE:

update.packages(ask = FALSE)

Diskussion

Im Laufe der Zeit werden die Paketautoren neue Versionen der Pakete mit Fehlerkorrekturen und neuen Funktionen veröffentlichen, und es ist in der Regel eine gute Idee, auf dem neuesten Stand zu bleiben. Bedenke jedoch, dass neue Versionen von Paketen manchmal Fehler enthalten oder ein leicht verändertes Verhalten aufweisen.

1.4 Laden einer durch Trennzeichen getrennten Textdatei

Problem

Du möchtest Daten aus einer Textdatei mit Trennzeichen laden.

Lösung

Die gebräuchlichste Art, eine Datei einzulesen, ist die Verwendung von kommagetrennten Werten (CSV-Daten):

data <- read.csv("datafile.csv")

Alternativ zu kannst du auch die Funktion read_csv() (beachte den Unterstrich statt des Punktes) aus dem readr-Paket verwenden. Diese Funktion ist deutlich schneller als read.csv() und kann Zeichenketten sowie Datum und Uhrzeit besser verarbeiten.

Diskussion

Da Datendateien viele verschiedene Formate haben, gibt es viele Möglichkeiten, sie zu laden. Zum Beispiel, wenn die Datendatei keine Kopfzeilen in der ersten Zeile hat:

data <- read.csv("datafile.csv", header = FALSE)

Der resultierende Datenrahmen wird Spalten mit den Namen V1, V2 und so weiter haben, die du wahrscheinlich manuell umbenennen möchtest:

# Manually assign the header names
names(data) <- c("Column1", "Column2", "Column3")

Du kannst das Trennzeichen mit sep festlegen. Wenn es durch Leerzeichen getrennt ist, verwendesep = " ". Wenn sie durch Tabulatoren getrennt ist, verwende \t:

data <- read.csv("datafile.csv", sep = "\t")

Standardmäßig werden die Strings in den Daten als Faktoren behandelt. Angenommen, dies ist deine Datendatei und du liest sie mit read.csv() ein:

"First","Last","Sex","Number"
"Currer","Bell","F",2
"Dr.","Seuss","M",49
"","Student",NA,21

Im resultierenden Datenrahmen werden First und Last als Faktoren gespeichert, obwohl es in diesem Fall sinnvoller ist, sie als Zeichenketten (oderZeichenvektoren in der R-Terminologie) zu behandeln. Um dies zu unterscheiden, verwendestringsAsFactors = FALSE. Wenn es weitere Spalten gibt, die als Faktoren behandelt werden sollen, kannst du sie einzeln umwandeln:

data <- read.csv("datafile.csv", stringsAsFactors = FALSE)

# Convert to factor
data$Sex <- factor(data$Sex)
str(data)
#> 'data.frame': 3 obs. of 4 variables:
#> $ First : chr "Currer" "Dr." ""
#> $ Last : chr "Bell" "Seuss" "Student"
#> $ Sex : Factor w/ 2 levels "F","M": 1 2 NA
#> $ Number: int 2 49 21

Alternativ kannst du die Datei auch mit Strings als Faktoren laden und dann einzelne Spalten von Faktoren in Zeichen umwandeln.

Siehe auch

read.csv() ist eine einfache Wrapper-Funktion um read.table() herum. Wenn du mehr Kontrolle über die Eingabe brauchst, siehe ?read.table.

1.5 Daten aus einer Excel-Datei laden

Problem

Du möchtest Daten aus einer Excel-Datei laden.

Lösung

Das Paket readxl enthält die Funktion read_excel() zum Lesen von .xls- und.xlsx-Dateien aus Excel. Damit wird das erste Blatt einer Excel-Tabelle gelesen:

# Only need to install once
install.packages("readxl")

library(readxl)
data <- read_excel("datafile.xlsx", 1)

Diskussion

Mit read_excel() kannst du von anderen Blättern laden, indem du eine Nummer oder einen Namen für sheet angibst:

data <- read_excel("datafile.xls", sheet = 2)

data <- read_excel("datafile.xls", sheet = "Revenues")

read_excel() verwendet die erste Zeile des Arbeitsblatts für die Spaltennamen. Wenn du diese Zeile nicht für die Spaltennamen verwenden willst, benutzecol_names = FALSE. Die Spalten heißen dann X1, X2, und so weiter.

Standardmäßig leitet read_excel() den Typ jeder Spalte ab, aber wenn du den Typ jeder Spalte angeben möchtest, kannst du das Argument col_typesverwenden. Du kannst auch Spalten auslassen, wenn du den Typ als"blank" angibst:

# Drop the first column, and specify the types of the next three columns
data <- read_excel("datafile.xls",
                   col_types = c("blank", "text", "date", "numeric"))

Siehe auch

Unter ?read_excel findest du weitere Optionen, um das Lesen dieser Dateien zu kontrollieren.

Es gibt noch andere Pakete zum Einlesen von Excel-Dateien. Das gdata-Paket hat eine Funktion read.xls() zum Einlesen von .xls-Dateien, und das xlsx-Paket hat eine Funktion read.xlsx() zum Einlesen von .xlsx-Dateien. Dazu muss eine externe Software auf deinem Computer installiert sein: read.xls() Das Paket gdata benötigt Java und read.xlsx() benötigt Perl.

1.6 Laden von Daten aus SPSS/SAS/Stata-Dateien

Problem

Du möchtest Daten aus einer SPSS-Datei oder aus anderen Programmen wie SAS oder Stata laden.

Lösung

Das haven-Paket hat die Funktion read_sav() zum Lesen von SPSS-Dateien. Um Daten aus einer SPSS-Datei zu laden:

# Only need to install the first time
install.packages("haven")

library(haven)
data <- read_sav("datafile.sav")

Diskussion

Das haven-Paket enthält auch Funktionen zum Lesen von anderen Formaten:

  • read_sas(): SAS

  • read_dta(): Stata

Eine Alternative zu haven ist das Paket foreign. Es unterstützt auch SPSS- und Stata-Dateien, ist aber nicht so aktuell wie die Funktionen von haven. Es unterstützt zum Beispiel nur Stata-Dateien bis zur Version 12, während haven bis zur Version 14 (die aktuelle Version zum Zeitpunkt dieses Artikels) unterstützt.

Das Auslandspaket unterstützt auch einige andere Formate, darunter:

  • read.octave(): Octave und MATLAB

  • read.systat(): SYSTAT

  • read.xport(): SAS XPORT

  • read.dta(): Stata

  • read.spss(): SPSS

Siehe auch

Führe ls("package:foreign") aus, um eine vollständige Liste der Funktionen im Fremdsprachenpaketzu erhalten.

1.7 Funktionen miteinander verknüpfen Zusammen mit %>%, dem Pipe-Operator

Problem

Du willst eine Funktion aufrufen und dann das Ergebnis an eine andere Funktion und noch eine weitere übergeben, und zwar so, dass es leicht lesbar ist.

Lösung

Verwende %>%, den Pipe-Operator. Zum Beispiel:

library(dplyr) # The pipe is provided by dplyr

morley # Look at the morley data set
#>     Expt Run Speed
#> 001    1   1   850
#> 002    1   2   740
#> 003    1   3   900
#>  ...<94 more rows>...
#> 098    5  18   800
#> 099    5  19   810
#> 100    5  20   870

morley %>%
  filter(Expt == 1) %>%
  summary()
#>       Expt        Run            Speed
#>  Min.   :1   Min.   : 1.00   Min.   : 650
#>  1st Qu.:1   1st Qu.: 5.75   1st Qu.: 850
#>  Median :1   Median :10.50   Median : 940
#>  Mean   :1   Mean   :10.50   Mean   : 909
#>  3rd Qu.:1   3rd Qu.:15.25   3rd Qu.: 980
#>  Max.   :1   Max.   :20.00   Max.   :1070

Diese Funktion nimmt den Datensatz morley und übergibt ihn an die Funktion filter() von dplyr, wobei nur die Datenzeilen beibehalten werden, bei denen Expt gleich 1 ist. Dann wird das Ergebnis an die Funktion summary() übergeben, die einige zusammenfassende Statistiken zu den Daten berechnet.

Ohne den Pipe-Operator würde der vorangehende Code wie folgt aussehen:

summary(filter(morley, Expt == 1))

In diesem Code werden die Funktionsaufrufe von innen nach außen abgearbeitet. Aus mathematischer Sicht macht das durchaus Sinn, aber aus Sicht der Lesbarkeit kann das verwirrend und schwer zu lesen sein, besonders wenn es viele verschachtelte Funktionsaufrufe gibt.

Diskussion

Dieses Muster mit dem %>% Operator wird häufig bei Tidyverse-Paketen verwendet, weil sie viele Funktionen enthalten, die relativ kleine Aufgaben erfüllen. Die Idee ist, dass diese Funktionen Bausteine sind, die es den Nutzern ermöglichen, die Funktionsaufrufe so zusammenzustellen, dass sie das gewünschte Ergebnis liefern.

Um zu verdeutlichen, was hier vor sich geht, hier ein einfacheres Beispiel mit zwei gleichwertigen Codeabschnitten:

f(x)

# Equivalent to:
x %>% f()

Der Pipe-Operator nimmt im Wesentlichen das, was links steht, und setzt es als erstes Argument des Funktionsaufrufs rechts ein.

Sie kann für mehrere Funktionsaufrufe in einer Kette verwendet werden:

h(g(f(x)))

# Equivalent to:
x %>%
  f() %>%
  g() %>%
  h()

In einer Funktionskette ist die lexikalische Reihenfolge der Funktionsaufrufe dieselbe wie die Reihenfolge, in der sie berechnet werden.

Wenn du das Endergebnis speichern willst, kannst du den <- Operator am Anfang verwenden. Dadurch wird zum Beispiel die ursprüngliche x durch das Ergebnis der Funktionskette ersetzt:

x <- x %>%
  f() %>%
  g() %>%
  h()

Wenn es zusätzliche Argumente für die Funktionsaufrufe gibt, werden sie nach rechts verschoben, wenn der Pipe-Operator verwendet wird. Wenn wir auf den Code aus dem ersten Beispiel zurückkommen, sind diese beiden gleichwertig:

filter(morley, Expt == 1)

morley %>% filter(Expt == 1)

Der Pipe-Operator stammt eigentlich aus dem Paket magrittr, aber dplyr importiert ihn und stellt ihn zur Verfügung, wenn du library(dplyr) aufrufst.

Siehe auch

Viele weitere Beispiele für die Verwendung von %>% bei der Datenmanipulation findest du inKapitel 15: .

Get R Graphics Cookbook, 2. Auflage now with the O’Reilly learning platform.

O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.