Listen in der R-Programmierung: Wie man Elemente erstellt und auswählt

⚡ Intelligente Zusammenfassung

Eine R-Liste ist ein Objekt, das Vektoren, Matrizen, Dataframes und sogar andere Listen in einem einzigen Container speichert. Die Funktion `list()` erstellt sie, und doppelte eckige Klammern rufen jedes Element wieder ab.

  • 🧺 Gemischte Lagerung: Eine Liste kann Objekte unterschiedlicher Typen und Längen speichern, was mit einem einfachen Vektor nicht möglich ist.
  • Bauschritt: list(vect, mat, df) packt einen Vektor, eine Matrix und einen Dataframe in ein einziges Objekt.
  • 🔢 Positionszugang: my_list[[2]] gibt das Element selbst zurück, während my_list[2] eine Liste mit einem Element zurückgibt.
  • 🏷️ Benannte Elemente: Durch das Taggen von Elementen bei der Erstellung wird der Zugriff über den $-Operator oder [[“name”] ermöglicht.
  • Änderungen direkt vor Ort: Durch eine Neuzuweisung wird ein Element aktualisiert, durch die Zuweisung von NULL wird es aus der Liste entfernt.
  • 🔗 Abflachung: unlist() reduziert eine verschachtelte Liste zu einem atomaren Vektor für die nachfolgende Analyse.

R-Liste: Erstellen einer Liste in R und Auswählen von Elementen

Was ist R-Liste?

R-Liste ist ein Objekt in der R-Programmierung, das Matrizen, Vektoren, Datenrahmen oder Listen enthält. R List wird auch verwendet, um eine Sammlung von Objekten zu speichern und sie bei Bedarf zu verwenden. Wir können uns die R-Liste als eine Tasche vorstellen, in die viele verschiedene Gegenstände passen. Wenn wir einen Gegenstand benötigen, können wir die Tasche öffnen und ihn verwenden.

Der Unterschied zu einem Vektor macht die Tasche so nützlich. Ein Vektor zwingt jedes Element in einen bestimmten Datentyp; so wird beispielsweise eine Zahl durch ein Wort zu Text. Eine Liste kennt diese Regel nicht, weshalb sie einen fünfelementigen Vektor oder eine zweizeilige Liste enthalten kann. Matrix und ein 714-zeiliger Datenrahmen daneben, ohne dass einer der Datensätze verändert wird.

Syntax der Liste in R

In der Programmiersprache R können wir die Funktion list() verwenden, um Listen zu erstellen:

list(element_1, ...)
arguments:
-element_1: store any type of R object
-...: pass as many objects as specifying. each object needs to be separated by a comma

Jedes Argument kann entweder ohne Argument oder in der Form übergeben werden Tag = WertEin einfaches Argument wird zu einem Positionselement, das nur über seine Nummer erreichbar ist, während ein getaggtes Argument zusätzlich einen Namen erhält. Die Basis-R-Referenz für Liste() dokumentiert beide Formen und merkt an, dass unlist() als ungefähre Umkehrung von as.list() fungiert.

So erstellen Sie eine Liste in R

Nachfolgend finden Sie eine Schritt-für-Schritt-Anleitung zum Erstellen einer Liste in R:

Im folgenden Beispiel erstellen wir drei verschiedene Objekte, einen Vektor, eine Matrix und ein Datenrahmen Verwenden der Listenfunktion in R.

Schritt 1) ​​Erstellen Sie einen Vektor

Verwenden Sie den folgenden Code, um einen Vektor in R zu erstellen

# Vector with numeric from 1 up to 5
vect  <- 1:5

Der Doppelpunktoperator erstellt die Sequenz 1, 2, 3, 4, 5 als Integer-Vektor, und der Zuweisungspfeil speichert sie unter dem Namen vect.

Schritt 2) Erstellen Sie eine Matrix

Erstellen Sie nun eine Matrix mithilfe des folgenden Codes.

# A 2x 5 matrix
mat  <- matrix(1:9, ncol = 5)
dim(mat)

Zwei Details verdienen hier Beachtung. Ein Raster mit zwei Zeilen und fünf Spalten benötigt zehn Werte, es werden jedoch nur neun angegeben. Daher verwendet R die Sequenz erneut und gibt eine Warnung aus, dass die Datenlänge kein Vielfaches der Zeilenanzahl ist. Dieser erneut verwendete Wert ist der Grund dafür, dass die zweite Zeile der ausgegebenen Matrix mit 1 statt mit 10 endet. Der Aufruf von `dim()` gibt anschließend die Form aus.

Ausgang:

## [1] 2 5

Schritt 3) Datenrahmen erstellen

Erstellen Sie mit dem folgenden Code einen Datenrahmen in R

# select the 10th row of the built-in R data set EuStockMarkets
df <- EuStockMarkets[1:10,]

Der Kommentar erwähnt die zehnte Zeile, der Ausdruck behält jedoch die Zeilen 1 bis 10 der integrierten EuStockMarkets-Serie bei. Durch die Teilmengenbildung wird außerdem die Zeitreihenklasse entfernt, sodass eine numerische Matrix anstelle eines echten Datenrahmens zurückgegeben wird. Genau deshalb enthält das unten ausgegebene Ergebnis Zeilenbeschriftungen im Format [1,] anstelle von Zeilennamen. Verwenden Sie `as.data.frame()`, wenn Sie einen echten Datenrahmen benötigen.

Schritt 4) Erstellen Sie eine Liste in R

Jetzt können wir die drei Objekte mit dem folgenden Code in die R-Liste einfügen

# Construct list with these vec, mat, and df:
my_list <- list(vect, mat, df)
my_list

Ausgang:

## [[1]]
## [1] 1 2 3 4 5

## [[2]]
##       [,1] [,2] [,3] [,4] [,5]
## [1,]    1    3    5    7    9
## [2,]    2    4    6    8    1

## [[3]]
##          DAX    SMI    CAC   FTSE
##  [1,] 1628.75 1678.1 1772.8 2443.6
##  [2,] 1613.63 1688.5 1750.5 2460.2
##  [3,] 1606.51 1678.6 1718.0 2448.2
##  [4,] 1621.04 1684.1 1708.1 2470.4
##  [5,] 1618.16 1686.6 1723.1 2484.7
##  [6,] 1610.61 1671.6 1714.3 2466.8
##  [7,] 1630.75 1682.9 1734.5 2487.9
##  [8,] 1640.17 1703.6 1757.4 2508.4
##  [9,] 1635.47 1697.5 1754.0 2510.5
##  [10,] 1645.89 1716.3 1754.3 2497.4

Die drei Überschriften in doppelten eckigen Klammern in dieser Ausgabe geben die Listenpositionen an. Es wurden keine Datenstrukturen umgewandelt oder vereinfacht: Element eins ist weiterhin ein Integer-Vektor, Element zwei ist weiterhin eine Matrix und Element drei enthält weiterhin alle zehn Zeilen mit Aktienkursen.

Wählen Sie Elemente aus der R-Liste aus

Nachdem wir unsere Liste erstellt haben, können wir ganz einfach darauf zugreifen. Wir verwenden den Index [[index]], um ein Element in der Liste auszuwählen. Der Wert in den doppelten eckigen Klammern gibt die Position des gewünschten Elements in der Liste an.tract. Wenn wir beispielsweise 2 in die Klammern einfügen, gibt R das zweite aufgelistete Element zurück.

Jetzt hier R-TutorialVersuchen wir, die zweiten Listenelemente in R mit dem Namen my_list auszuwählen. Wir verwenden my_list[[2]]

# Print second element of the list
my_list[[2]]

Ausgang:

##      [,1] [,2] [,3] [,4] [,5]
## [1,]    1    3    5    7    9
## [2,]    2    4    6    8    1

Einfache und doppelte Klammern sind nicht austauschbar, und ihre Verwechslung ist die häufigste Fehlerquelle in Listen. Eine Klammer behält den umschließenden Text bei, zwei Klammern entfernen ihn.

Ausdruck Was kommt zurück Klasse des Ergebnisses Verwenden Sie es, wenn
meine_liste[[2]] Das gespeicherte Element selbst Was auch immer gespeichert war, hier eine Matrix Sie müssen eine Berechnung mit einem Element durchführen.
meine_liste[2] Eine Unterliste, die dieses eine Element enthält Liste Sie müssen den Listenwrapper beibehalten.
my_list[c(1, 3)] Eine Teilliste der ausgewählten Elemente Liste Sie benötigen mehrere Elemente gleichzeitig
meine_liste[-2] Alle Elemente außer dem zweiten Liste Sie müssen ein Element entfernen.
# Compare the two bracket styles
class(my_list[[2]])   # the matrix itself
class(my_list[2])     # a list of length one

# Several elements, and everything but one element
my_list[c(1, 3)]
my_list[-2]

Benannte Listen in R

Positionsindizes sind fehleranfällig: Beim Einfügen eines Elements verschiebt sich die Zahl nach dem Einfügen. Durch die Benennung der Elemente wird dieses Risiko beseitigt und der Code so lesbar, dass er die beschriebenen Daten widerspiegelt. Namen können beim Erstellen der Liste vergeben oder nachträglich mit `names()` hinzugefügt werden.

# Tag each element at creation time
named_list <- list(numbers = vect, grid = mat, prices = df)

# Three ways to reach the same element
named_list$grid
named_list[["grid"]]
named_list["grid"]      # returns a one-element list

# Read or replace the names later
names(named_list)
names(named_list)[2] <- "grid_2x5"

Der $-Operator und die doppelten eckigen Klammern unterscheiden sich in einem Punkt, der Anfänger oft verwirrt. Der $-Operator führt eine Teilübereinstimmung durch, sodass `named_list$pri` weiterhin Preise findet, während `named_list[["pri"]]` NULL zurückgibt, da doppelte eckige Klammern exakt übereinstimmen, es sei denn, `exact = FALSE` wird übergeben. Die Teilübereinstimmung ist in der Konsole praktisch, in einem Skript jedoch unsicher. Daher sollte in gespeichertem Code die exakte Form bevorzugt werden.

# A compact map of the whole structure
str(named_list)

Die Funktion str() gibt für jedes Element eine Zeile mit dessen Typ und Größe aus. Dies ist die schnellste Möglichkeit, um zu überprüfen, ob eine Liste das enthält, was man erwartet, bevor man auf sie zugreift.

Elemente in einer R-Liste ändern, hinzufügen und löschen

Eine Liste ist nach ihrer Erstellung nicht unveränderlich. Dieselben Methoden, die ein Element lesen, schreiben auch darauf, daher werden zum Aktualisieren, Erweitern und Verkleinern einer Liste stets normale Zuweisungen verwendet.

# Replace an element in place
named_list[["numbers"]] <- 1:10

# Add a new element simply by naming it
named_list[["created"]] <- Sys.Date()

# Append without a name: the element lands at the end
named_list <- append(named_list, list(TRUE))

# Delete an element by assigning NULL to it
named_list[["created"]] <- NULL
  • Ersetzen: Die Zuweisung eines bereits vorhandenen Namens überschreibt dieses Element, seine Position bleibt jedoch unverändert.
  • Hinzufügen: Die Zuweisung zu einem nicht existierenden Namen fügt ein neues Element am Ende der Liste an.
  • Anhängen: Die Funktion append() erwartet als zweites Argument eine Liste. Daher muss ein einfacher Wert vor der Übergabe in list() eingeschlossen werden.
  • Löschen: Die Zuweisung von NULL mit doppelten eckigen Klammern entfernt das Element und verkürzt die Liste.

Eine häufige Folge davon ist, dass NULL das Löschen bedeutet. Daher kann man mit doppelten Klammern kein tatsächliches NULL speichern. Verwenden Sie stattdessen eine Zuweisung mit einfachen Klammern, wie in `named_list["empty"] <- list(NULL)`. Dadurch bleibt der Platzhalter erhalten und NULL wird darin gespeichert.

Verschachtelte Listen und unlist() in R

Da eine Liste beliebige R-Objekte enthalten kann, kann sie auch andere Listen enthalten. Verschachtelung ist die übliche Darstellungsweise von Konfigurationsobjekten, JSON-Antworten und Modellergebnissen in R; daher gehören das Aufgreifen auf verschachtelte Listen und das Vereinfachen von Listen zu den alltäglichen Aufgaben.

# A list whose elements are themselves lists
project <- list(
  meta = list(owner = "analyst", year = 2026),
  data = list(vect, mat)
)

# Chain the accessors to reach an inner value
project$meta$year
project[["data"]][[2]]

# Flatten every level into one atomic vector
flat <- unlist(project)

# Strip a single level and keep the rest as a list
half <- unlist(project, recursive = FALSE)

Das Glätten von Listen hat einen gewissen Aufwand, den es zu verstehen gilt. `unlist()` muss einen atomaren Vektor zurückgeben und wandelt daher jeden Wert in den allgemeinsten vorhandenen Datentyp um, und zwar in der Reihenfolge logisch, Integer, Double, Zeichen. Eine verschachtelte Liste, die Zahlen und Text enthält, wird daher vollständig als Text zurückgegeben. Die Namen des Ergebnisses werden durch die Verknüpfung der äußeren und inneren Tags gebildet, weshalb ein Element als `meta.owner` und nicht als `owner` zurückgegeben wird.

Setzen Sie `use.names = FALSE`, wenn zusammengesetzte Namen unerwünscht sind, und `recursive = FALSE`, wenn nur die äußerste Ebene entfernt werden soll. Falls die Werte ihre Datentypen behalten müssen, lassen Sie die Struktur intakt und arbeiten Sie die Liste durch, anstatt sie zu vereinfachen.

Integrierter Datenrahmen in R

Listen werden oft mit Daten gefüllt, die von der Festplatte oder aus dem Internet gelesen werden. Daher ist es hilfreich zu verstehen, wie ein Dataframe entsteht, bevor die Daten darin gespeichert werden. Bevor wir unseren eigenen Dataframe erstellen, können wir uns den online verfügbaren R-Datensatz ansehen. Der Gefängnisdatensatz hat die Dimension 714×5. Mit der Funktion `tail()` können wir uns einen schnellen Überblick über das Ende des Dataframes verschaffen. Analog dazu zeigt `head()` den Anfang des Dataframes an. Die Anzahl der angezeigten Zeilen kann mit `head(df, 5)` festgelegt werden. Wir werden später mehr über die Funktion `read.csv()` erfahren. Daten in R importieren Tutorial.

PATH <-'https://raw.githubusercontent.com/guru99-edu/R-Programming/master/prison.csv'
df <- read.csv(PATH)[1:5]
head(df, 5)

Ausgang:

##   X state year govelec black
## 1 1     1   80       0 0.2560
## 2 2     1   81       0 0.2557
## 3 3     1   82       1 0.2554
## 4 4     1   83       0 0.2551
## 5 5     1   84       0 0.2548

Die Anweisung [1:5] nach read.csv() wählt die ersten fünf Spalten aus, nicht die ersten fünf Zeilen, da ein Dataframe selbst eine Liste von Spalten ist. Die Indizierung einer Liste mit einfachen eckigen Klammern liefert eine kleinere Liste, und diese kleinere Liste ist wiederum ein Dataframe.

Wir können die Struktur des Datenrahmens mit str überprüfen:

# Structure of the data
str(df)

Ausgang:

## 'data.frame':    714 obs. of  5 variables:
##  $ X      : int  1 2 3 4 5 6 7 8 9 10 ...
##  $ state  : int  1 1 1 1 1 1 1 1 1 1 ...
##  $ year   : int  80 81 82 83 84 85 86 87 88 89 ...
##  $ govelec: int  0 0 1 0 0 0 1 0 0 0 ...
##  $ black  : num  0.256 0.256 0.255 0.255 0.255 ...

Alle Variablen werden im gespeichert numerisch Format. Das $-Präfix in jeder Zeile ist derselbe Operator, der zuvor bei benannten Listen verwendet wurde. Dies bestätigt, dass ein Dataframe eine Liste gleichlanger Spalten mit rechteckigen Beschriftungen ist. Alles, was über das Benennen, Auswählen und Löschen von Listenelementen gelernt wurde, lässt sich daher direkt auf das Format übertragen. R-Datentypen und in Datenrahmenspalten.

Häufig gestellte Fragen

Ein Vektor zwingt alle Elemente, denselben Datentyp zu haben. Wenn also Text und Zahlen gemischt werden, wird alles in Zeichenketten umgewandelt. Eine Liste hingegen speichert jedes Element exakt so, wie es übergeben wurde, einschließlich Vektoren, Matrizen und Funktionen unterschiedlicher Länge. Verwenden Sie `typeof()`, um die beiden Datentypen zu unterscheiden.

Ruft man `is.list(x)` auf, gibt es für Listen und Pairlists `TRUE` zurück. `class(x)` gibt die Objektklasse zurück, während `typeof(x)` auch für Dataframes „list“ zurückgibt, da ein Dataframe intern eine Liste von Spalten gleicher Länge ist.

`length(my_list)` zählt nur die Elemente der obersten Ebene, daher wird eine verschachtelte Liste weiterhin als ein Element gezählt. `lengths(my_list)` gibt die Größe jedes Elements in einem einzigen Aufruf aus, was schneller und übersichtlicher ist als `loo`.ping wenn die Elemente unterschiedlich sind.

lapply(my_list, FUN) wendet ein Funktion Die Funktion `sapply()` durchläuft jedes Element und gibt eine Liste zurück. `sapply()` vereinfacht das Ergebnis nach Möglichkeit zu einem Vektor oder einer Matrix. Eine einfache `for`-Schleife über `seq_along(my_list)` funktioniert ebenfalls und ist übersichtlich.

Wenn alle Elemente die gleiche Länge haben, funktioniert as.data.frame(my_list) direkt. Bei einer Liste von Zeilen gleicher Breite stapelt do.call(rbind, my_list) diese zuerst. dplyr Das Ökosystem bietet die Funktion as_tibble() an, wenn Spaltentypen unverändert erhalten bleiben müssen.

Listen haben keine eingebaute Sortierfunktion, daher z. B.tracZuerst den vergleichbaren Schlüssel verwenden: my_list[order(sapply(my_list, length))] sortiert die Liste nach Elementgröße neu. Bei rechteckigen Daten in einen Frame konvertieren und Sortieren Sie den Datenrahmen stattdessen mit order().

KI-Assistenten lesen die Ausgabe von `str()` und erklären, warum ein Index `NULL` oder eine Teilliste anstelle eines Wertes zurückgegeben hat. Sie schlagen außerdem die korrekte Klammerform vor, entwerfen Pipelines für `lapply()` und kennzeichnen stille Typumwandlungen, bevor diese das Ergebnis verfälschen.

Ja. GitHub-Copilot arbeitet in RStudio Ab Version 2023.09.0 können Sie über „Tools“, „Globale Optionen“ und dann die Code-Assistenten-Einstellung die Aufrufe von `list()`, `names()` und `unlist()` aus einem Kommentar vervollständigt. Allerdings muss jeder Vorschlag noch überprüft werden.

Fassen Sie diesen Beitrag mit folgenden Worten zusammen: