HOWTO · R

Finden die Zeilennummer in R

Dieses Tutorial zeigt, wie Sie eine Zeilennummer für einen Wert in R finden.

Auf dieser Seite

Mit which() findest du jede Zeilenposition, die eine Bedingung erfüllt. match() liefert dagegen die erste Position für jeden gesuchten Wert. Zum Beispiel gibt which(staff$role == "Senior Dev") die Positionen aller passenden Zeilen in staff zurück. Erfüllt keine Zeile die Bedingung, liefert which() integer(0). Bei match() ergibt eine nicht gefundene Anfrage NA.

Diese Positionen sind Zeilennummern, wenn der logische Test oder der Suchvektor der Zeilenreihenfolge des Dataframes folgt. In gewöhnlichen R-Dataframes beginnen Zeilenpositionen bei 1. Wenn du stattdessen die Zeilenbezeichnung brauchst, kannst du rownames(data) vergleichen oder sie mit match() suchen.

Zeilennummern mit which() finden

which() erhält einen logischen Vektor und gibt die Positionen zurück, an denen seine Werte TRUE sind. Ein Vergleich mit einer Dataframe-Spalte erzeugt einen solchen logischen Vektor. Die zurückgegebenen Positionen bezeichnen daher Zeilen in derselben Reihenfolge wie im Dataframe. Die Funktion liefert alle Treffer und eignet sich deshalb für Bedingungen, die mehrere Zeilen auswählen können.

Führe dieses Beispiel aus:

staff <- data.frame(
  name = c("Ari", "Bea", "Chen", "Devi"),
  role = c("Analyst", "Senior Dev", "Senior Dev", "Manager")
)
which(staff$role == "Senior Dev")

Das Ergebnis enthält die Positionen 2 und 3, weil beide Zeilen diese Rolle haben. Um Zeilen anhand einer numerischen oder zusammengesetzten Bedingung zu finden, ändere den logischen Ausdruck. which(grades$Math > 80) wählt zum Beispiel alle Zeilen aus, deren Math-Wert größer als 80 ist. Behalte die Reihenfolge der Dataframe-Zeilen im Blick, wenn du diese Positionen später zum Teilmengen-Auswählen eines anderen Objekts verwendest.

Bei benutzerdefinierten Zeilennamen kannst du die von rownames() zurückgegebenen Bezeichnungen vergleichen:

people <- data.frame(name = c("Ari", "Bea", "Chen"))
rownames(people) <- c("north", "central", "south")
which(rownames(people) == "central")

Damit erhältst du die Position der Zeile mit der Bezeichnung central; die Bezeichnung selbst ist keine Zeilennummer. Wenn ein Vektor bereits eins zu eins den Zeilen zugeordnet ist, funktioniert which(values == target) genauso. Bei einem eigenständigen Vektor solltest du das Ergebnis als Position bezeichnen. Eine Zeilennummer ist es nur, wenn der Vektor die Zeilen des Dataframes repräsentiert.

Enthält der Vergleich fehlende Werte, gibt which() deren Positionen nicht zurück. Wenn fehlende Werte als Teil der Bedingung berücksichtigt werden sollen, behandle sie im logischen Ausdruck ausdrücklich, bevor du which() aufrufst.

Die erste Position eines Werts mit match() finden

Verwende match(query, table), wenn du die erste Position eines Werts in einem Vektor, einer Spalte oder einem Zeilennamenvektor suchst. query kann einen oder mehrere Werte enthalten; das Ergebnis enthält eine Position pro Anfrage. Anders als which() gibt match() für jede Anfrage nur das erste Vorkommen zurück. Eine Anfrage, die in table fehlt, ergibt standardmäßig NA.

Bei einer Dataframe-Spalte gibst du zuerst den gesuchten Wert und dann die Spalte an:

staff <- data.frame(
  role = c("Analyst", "Senior Dev", "Senior Dev", "Manager")
)
match("Senior Dev", staff$role)

Die zurückgegebene Position ist 2, also die der ersten passenden Zeile, obwohl der Wert später erneut vorkommt. Dieselbe Form funktioniert mit Vektoren: match(78, grades) findet die erste Position von 78. Mit match("central", rownames(people)) erhältst du die Position einer Zeilenbezeichnung.

Übergib mehrere gesuchte Werte als Vektor, um für jeden eine Position zu erhalten:

grades <- c(88, 90, 75, 94, 80)
match(c(75, 94, 70), grades)

Das Ergebnis enthält die Positionen für 75 und 94, gefolgt von NA für 70. Die Positionen folgen der Reihenfolge der Anfragen, nicht der Reihenfolge in der Tabelle. Bei doppelten Werten in der Tabelle verweist jede Anfrage weiterhin auf das erste Vorkommen. Prüfe bei einer nicht gefundenen Anfrage auf NA, bevor du die Position zum Auswählen einer Teilmenge eines anderen Objekts verwendest.

Fazit

Wähle which(), wenn eine Bedingung mehrere Zeilen erfüllen kann und du alle Positionen benötigst. Gibt es keine Treffer, liefert die Funktion integer(0). Wähle match(), wenn du einen oder mehrere Werte nachschlägst und jeweils deren erste Position brauchst; für einen fehlenden Wert liefert sie NA. Bei beiden Funktionen entsprechen die Positionen nur dann den Dataframe-Zeilen, wenn der durchsuchte Vektor dieselbe Zeilenreihenfolge hat. Wenn du die Zeilenbezeichnung statt ihrer Position brauchst, verwende rownames().