Ich habe einen Datenrahmen mit dem Namen "mydata", der folgendermaßen aussieht:
A B C D
1. 5 4 4 4
2. 5 4 4 4
3. 5 4 4 4
4. 5 4 4 4
5. 5 4 4 4
6. 5 4 4 4
7. 5 4 4 4
Ich möchte Zeile 2,4,6 löschen. Zum Beispiel so:
A B C D
1. 5 4 4 4
3. 5 4 4 4
5. 5 4 4 4
7. 5 4 4 4
Antworten:
Die Schlüsselidee ist, dass Sie eine Menge der Zeilen bilden, die Sie entfernen möchten, und die Ergänzung dieser Menge beibehalten.
In R wird das Komplement einer Menge durch den Operator '-' angegeben.
Angenommen, das
data.frame
heißtmyData
:Vergessen
myData
Sie natürlich nicht, "neu zuzuweisen", wenn Sie diese Zeilen vollständig löschen möchten - andernfalls druckt R nur die Ergebnisse.quelle
,
! ;)drop = FALSE
dort ein hinzu.-
es zu verwenden, funktioniert es nicht, da der Komplementoperator für logisch ist!
. Das Komplement von c (2,4,6) in den Zeilen wäre eher setdiff (c (2,4,6), 1: nrow (myData)), was nicht c (-2, -4, -6) ist. , obwohl beide bei Verwendung mit die gleichen Zeilen ergeben würden[
.myData[-c(2, 4, 6),,drop=F]
. In der Tat würde ich vorschlagen, dass Sie immer,drop=F
kurz vor dem]
in einem Matrixzugriff einfügen .Sie können auch mit einem sogenannten booleschen Vektor arbeiten, auch bekannt als
logical
:Beachten Sie, dass der
!
Operator als NOT fungiert, dh!TRUE == FALSE
:Dies scheint im Vergleich zu @ mrwabs Antwort (+1 übrigens :)) etwas umständlich zu sein, aber ein logischer Vektor kann im laufenden Betrieb generiert werden, z. B. wenn ein Spaltenwert einen bestimmten Wert überschreitet:
Sie können einen booleschen Vektor in einen Vektor von Indizes umwandeln:
Ein sehr guter Trick ist schließlich, dass Sie diese Art der Teilmenge nicht nur zum Extrahieren, sondern auch zum Zuweisen verwenden können:
Dabei wird eine Spalte
A
zugewiesenNA
(keine Nummer), wobeiA
4 überschritten wird.quelle
Probleme beim Löschen nach Zeilennummer
Für schnelle und schmutzige Analysen können Sie Zeilen eines data.frame nach Nummer gemäß der oberen Antwort löschen. Dh
Wenn Sie jedoch versuchen, ein robustes Datenanalyseskript zu schreiben, sollten Sie generell vermeiden, Zeilen nach numerischer Position zu löschen. Dies liegt daran, dass sich die Reihenfolge der Zeilen in Ihren Daten in Zukunft ändern kann. Ein allgemeines Prinzip eines data.frame oder einer Datenbanktabelle ist, dass die Reihenfolge der Zeilen keine Rolle spielen sollte. Wenn die Reihenfolge von Bedeutung ist, sollte dies in einer tatsächlichen Variablen im data.frame codiert werden.
Stellen Sie sich beispielsweise vor, Sie haben ein Dataset importiert und Zeilen nach numerischer Position gelöscht, nachdem Sie die Daten überprüft und die Zeilennummern der Zeilen identifiziert haben, die Sie löschen möchten. Zu einem späteren Zeitpunkt gehen Sie jedoch in die Rohdaten und sehen sich um und ordnen die Daten neu. Ihr Zeilenlöschcode löscht jetzt die falschen Zeilen. Schlimmer noch, es ist unwahrscheinlich, dass Sie Fehler erhalten, die Sie darauf hinweisen.
Bessere Strategie
Eine bessere Strategie besteht darin, Zeilen basierend auf inhaltlichen und stabilen Eigenschaften der Zeile zu löschen. Wenn Sie beispielsweise eine
id
Spaltenvariable hatten, die jeden Fall eindeutig identifiziert, können Sie diese verwenden.In anderen Fällen haben Sie ein formales Ausschlusskriterium, das angegeben werden kann, und Sie können eines der vielen Teilmengenwerkzeuge in R verwenden, um Fälle auszuschließen, die auf dieser Regel basieren.
quelle
Erstellen Sie eine ID-Spalte in Ihrem Datenrahmen oder verwenden Sie einen beliebigen Spaltennamen, um die Zeile zu identifizieren. Die Verwendung von Index ist nicht fair zu löschen.
Verwenden Sie die
subset
Funktion, um einen neuen Rahmen zu erstellen.quelle
Durch vereinfachte Reihenfolge:
Nach Reihenfolge:
Durch negative Reihenfolge:
Oder wenn Sie eine Teilmenge durch Auswahl ungerader Zahlen erstellen möchten:
Oder wenn Sie eine Teilmenge durch Auswahl ungerader Zahlen erstellen möchten, Version 2:
Oder wenn Sie eine Teilmenge durch Herausfiltern gerader Zahlen erstellen möchten:
Oder wenn Sie eine Teilmenge durch Herausfiltern gerader Zahlen erstellen möchten, Version 2:
quelle
Dan aus employee.data löschen - Es ist nicht erforderlich, einen neuen data.frame zu verwalten.
quelle
Hier ist eine schnelle und schmutzige Funktion zum Entfernen einer Zeile nach Index.
Der Hauptfehler besteht darin, dass das Argument row_index nicht dem R-Muster folgt, ein Vektor von Werten zu sein. Es kann andere Probleme geben, da ich nur ein paar Minuten damit verbracht habe, es zu schreiben und zu testen, und erst in den letzten Wochen angefangen habe, R zu verwenden. Kommentare und Verbesserungen hierzu wären sehr willkommen!
quelle
Der Vollständigkeit halber möchte ich hinzufügen, dass dies
dplyr
auch mit verwendet werden kannslice
. Dies hat den Vorteil, dass es Teil eines Pipeline-Workflows sein kann.Natürlich können Sie es auch ohne Rohre verwenden.
Das Format "kein Vektor"
-c(2, 4, 6)
bedeutet, dass Sie alles erhalten, was sich nicht in den Zeilen 2, 4 und 6 befindet. Wenn Sie beispielsweise einen Bereich verwenden, können Sie beispielsweise die ersten 5 Zeilen entfernenslice(df, 6:n())
. Weitere Beispiele finden Sie in den Dokumenten .quelle