wake-up-neo.com

Wie lösche ich Zeilen in einem Datenrahmen?

Ich habe einen Datenrahmen namens "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 die 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 
175
R newbie

Die Schlüsselidee ist, dass Sie eine Gruppe von Zeilen bilden, die Sie entfernen möchten, und das Komplement dieser Gruppe beibehalten.

In R wird das Komplement einer Menge durch den Operator '-' angegeben.

Angenommen, der data.frame heißt myData:

myData[-c(2, 4, 6), ]   # notice the -

Vergessen Sie natürlich nicht, myData "neu zuzuordnen", wenn Sie diese Zeilen vollständig löschen möchten - andernfalls druckt R die Ergebnisse.

myData <- myData[-c(2, 4, 6), ]
269

Sie können auch mit einem sogenannten booleschen Vektor, auch bekannt als logical, arbeiten:

row_to_keep = c(TRUE, FALSE, TRUE, FALSE, TRUE, FALSE, TRUE)
myData = myData[row_to_keep,]

Beachten Sie, dass der !-Operator als NOT fungiert, d. H. !TRUE == FALSE:

myData = myData[!row_to_keep,]

Dies erscheint im Vergleich zu @ mrwabs Antwort (+1 btw :)) etwas umständlich, aber ein logischer Vektor kann im laufenden Betrieb erzeugt werden, z. Wenn ein Spaltenwert einen bestimmten Wert überschreitet:

myData = myData[myData$A > 4,]
myData = myData[!myData$A > 4,] # equal to myData[myData$A <= 4,]

Sie können einen booleschen Vektor in einen Vektor von Indizes transformieren:

row_to_keep = which(myData$A > 4)

Ein sehr netter Trick ist schließlich, dass Sie diese Art des Subsetings nicht nur zur Extraktion, sondern auch zur Zuweisung verwenden können:

myData$A[myData$A > 4,] <- NA

wobei Spalte ANA zugewiesen ist (keine Zahl), wobei A 4 überschreitet.

68
Paul Hiemstra

Probleme beim Löschen nach Zeilennummer

Für schnelle und fehlerhafte Analysen können Sie die Zeilen eines data.frame nach Nummer gemäß der ersten Antwort löschen. Das heißt,

newdata <- myData[-c(2, 4, 6), ] 

Wenn Sie jedoch versuchen, ein robustes Datenanalyse-Skript zu schreiben, sollten Sie generell das Löschen von Zeilen nach numerischer Position vermeiden. Dies liegt daran, dass sich die Reihenfolge der Zeilen in Ihren Daten in der Zukunft ändern kann. Ein allgemeines Prinzip von data.frame oder Datenbanktabellen besteht darin, dass die Reihenfolge der Zeilen keine Rolle spielt. Wenn die Reihenfolge eine Rolle spielt, sollte dies in einer tatsächlichen Variablen im data.frame codiert sein.

Stellen Sie sich zum Beispiel vor, Sie haben eine Datenmenge importiert und Zeilen nach der numerischen Position gelöscht, nachdem Sie die Daten geprüft und die Zeilennummern der Zeilen ermittelt haben, die Sie löschen wollten. Später gehen Sie jedoch in die Rohdaten, schauen sich um und ordnen die Daten neu. Ihr Zeilenlöschungscode löscht nun die falschen Zeilen und es ist unwahrscheinlich, dass Sie Fehlermeldungen erhalten, die Sie darauf aufmerksam machen.

Bessere Strategie

Eine bessere Strategie ist das Löschen von Zeilen basierend auf wesentlichen und stabilen Eigenschaften der Zeile. Wenn Sie beispielsweise eine id-Spaltenvariable hätten, die jeden Fall eindeutig identifiziert, können Sie dies verwenden.

newdata <- myData[ !(myData$id %in% c(2,4,6)), ]

In anderen Fällen haben Sie möglicherweise formale Ausschlusskriterien, die angegeben werden können, und Sie können eines der vielen Subsetting-Tools in R verwenden, um auf dieser Regel basierende Fälle auszuschließen. 

44
Jeromy Anglim

Erstellen Sie eine ID-Spalte in Ihrem Datenrahmen oder verwenden Sie einen beliebigen Spaltennamen, um die Zeile zu identifizieren. Die Verwendung des Index ist nicht fair zu löschen. 

Verwenden Sie die Funktion subset, um einen neuen Rahmen zu erstellen.

updated_myData <- subset(myData, id!= 6)
print (updated_myData)

updated_myData <- subset(myData, id %in% c(1, 3, 5, 7))
print (updated_myData)

In vereinfachter Reihenfolge:

mydata[-(1:3 * 2), ]

Nach Reihenfolge:

mydata[seq(1, nrow(mydata), by = 2) , ]

Nach negativer Reihenfolge:

mydata[-seq(2, nrow(mydata), by = 2) , ]

Oder wenn Sie durch Auswahl ungerader Zahlen eine Teilmenge festlegen möchten:

mydata[which(1:nrow(mydata) %% 2 == 1) , ]

Oder wenn Sie durch Auswahl ungerader Zahlen eine Teilmenge festlegen möchten, Version 2:

mydata[which(1:nrow(mydata) %% 2 != 0) , ]

Oder wenn Sie eine Untermenge durch Filtern von geraden Zahlen erstellen möchten:

mydata[!which(1:nrow(mydata) %% 2 == 0) , ]

Oder wenn Sie Teilmengen durch Herausfiltern von geraden Zahlen, Version 2, erhalten möchten:

mydata[!which(1:nrow(mydata) %% 2 != 1) , ]
5

Lösche Dan aus employee.data - Es muss kein neuer data.frame verwaltet werden.

employee.data <- subset(employee.data, name!="Dan")
0
SQLWolfe

Hier ist eine schnelle und schmutzige Funktion zum Entfernen einer Indexreihe.

removeRowByIndex <- function(x, row_index) {
  nr <- nrow(x)
  if (nr < row_index) {
    print('row_index exceeds number of rows')
  } else if (row_index == 1)
  {
    return(x[2:nr, ])
  } else if (row_index == nr) {
    return(x[1:(nr - 1), ])
  } else {
    return (x[c(1:(row_index - 1), (row_index + 1):nr), ])
  }
}

Der Hauptfehler ist, dass das Argument row_index nicht dem R-Muster folgt, ein Wertevektor zu sein. Es kann andere Probleme geben, da ich nur wenige Minuten mit dem Schreiben und Testen verbracht habe und erst in den letzten Wochen mit R angefangen habe. Alle Kommentare und Verbesserungen dazu sind sehr willkommen!

0
Alan Carlyle