35 Stimmen

Aufhebung der Auswahl einer Spalte nach Name

Gibt es eine Möglichkeit, alle Spalten eines Datenrahmens auszuwählen, mit Ausnahme einer Spalte, die einen bestimmten Namen hat?

Es wäre das Analogon zu df[, -1] mit Ausnahme der Verwendung des Spaltennamens anstelle des Indexes?

61voto

csgillespie Punkte 56872

Sie können dies mit Hilfe von Vektor-Subsets tun. Erstellen Sie zunächst einen Dummy-Datensatz:

R> dd = data.frame(A = 1:3, B = 1:3, C=1:3, D=1:3)

Verwenden Sie dann die ! Operator, um die Auswahl rückgängig zu machen:

R> dd[ ,!(colnames(dd) == "A")]

  B C D
1 1 1 1
2 2 2 2
3 3 3 3

Alternativ könnten Sie auch:

  • Eine etwas kürzere Version (mit freundlicher Genehmigung von @Tomas):

    dd[ , names(dd) != "A"]
  • Um mit mehreren Spalten zurechtzukommen (mit freundlicher Genehmigung von @Tyler)

    dd[ ,!(colnames(dd) %in% c("A", "B"))]

10voto

BenBarnes Punkte 18856

Man könnte die which() um die zu eliminierende Spalte zu identifizieren.

dd <- data.frame(A = 1:5, B = 1:5, C=1:5)

dd[, -which(names(dd) == "A")]

oder positiv

dd[, which(names(dd) != "A")]

Wenn es jedoch keine Spalte mit dem Namen "A" gibt, würden Sie einen Datenrahmen mit 0 Spalten und nrow(dd) Reihen. Es wäre also gut zu prüfen, ob eine Spalte mit dem Namen "A" vorhanden ist.

if(any(names(dd) == "A")) {
  dd[, which(names(dd) != "A")]
}

9voto

Greg Snow Punkte 46977

Die subset Funktion erlaubt diese Art von Syntax bereits, wie die Beispiele auf der Hilfeseite zeigen:

subset(airquality, Day == 1, select = -Temp)

5voto

Andre Elrico Punkte 10065

A und C entfernen

base Lösung

df <- data.frame(A = 1:3, B = 1:3, C=1:3, D=1:3)

df[,c("A","C")]<-NULL

data.table Lösung

dt <- data.table(A = 1:3, B = 1:3, C=1:3, D=1:3)

#    A B C D
# 1: 1 1 1 1
# 2: 2 2 2 2
# 3: 3 3 3 3

dt[,c("A","C"):=NULL]

#   B D
#1: 1 1
#2: 2 2
#3: 3 3

4voto

mojimoji Punkte 141

Um die Auswahl mehrerer Spalten aufzuheben, können Sie das Paket dplyr verwenden. Als Beispiel:

dd = data.frame(A = 1:3, B = 1:3, C=1:3, D=1:3)

library(dplyr)
newdd <- select(dd, -A,-C)

Dies ist eine weitere Möglichkeit neben dem, was @csgillespie vorgeschlagen hat.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X