1044 Stimmen

Spalten des Datenrahmens nach Namen löschen

Ich habe eine Reihe von Spalten, die ich aus einem Datenrahmen entfernen möchte. Ich weiß, dass wir sie einzeln mit etwas wie löschen können:

df$x <- NULL

Aber ich hatte gehofft, dies mit weniger Befehlen erreichen zu können.

Ich weiß auch, dass ich Spalten mit Integer-Indexierung wie diese löschen könnte:

df <- df[ -c(1, 3:6, 12) ]

Ich bin jedoch besorgt, dass sich die relative Position meiner Variablen ändern könnte.

In Anbetracht der Leistungsfähigkeit von R dachte ich mir, dass es einen besseren Weg geben könnte, als jede Spalte einzeln zu löschen.

1046voto

Joris Meys Punkte 102836

Sie können eine einfache Liste von Namen verwenden:

DF <- data.frame(
  x=1:10,
  y=10:1,
  z=rep(5,10),
  a=11:20
)
drops <- c("x","z")
DF[ , !(names(DF) %in% drops)]

Alternativ können Sie auch eine Liste mit den zu behaltenden Personen erstellen und sie namentlich erwähnen:

keeps <- c("y", "a")
DF[keeps]

EDIT : Für diejenigen, die noch nicht mit dem drop Argument der Indizierungsfunktion, wenn Sie eine Spalte als Datenrahmen behalten wollen:

keeps <- "y"
DF[ , keeps, drop = FALSE]

drop=TRUE (oder die Nichterwähnung) lässt unnötige Dimensionen weg und gibt daher einen Vektor mit den Werten der Spalte y .

547voto

Prasad Chalasani Punkte 19486

Außerdem gibt es die subset Befehl, der nützlich ist, wenn Sie wissen, welche Spalten Sie benötigen:

df <- data.frame(a = 1:10, b = 2:11, c = 3:12)
df <- subset(df, select = c(a, c))

AKTUALISIERT nach Kommentar von @hadley: Zu fallen lassen Spalten a,c könnte man machen:

df <- subset(df, select = -c(a, c))

265voto

Max Ghenis Punkte 12577
within(df, rm(x))

ist wahrscheinlich am einfachsten, oder für mehrere Variablen:

within(df, rm(x, y))

Oder wenn Sie sich mit data.table s (pro Wie löscht man eine Spalte nach Namen in data.table? ):

dt[, x := NULL]   # Deletes column x by reference instantly.

dt[, !"x"]   # Selects all but x into a new data.table.

oder für mehrere Variablen

dt[, c("x","y") := NULL]

dt[, !c("x", "y")]

139voto

Joshua Ulrich Punkte 167720

Sie könnten verwenden %in% wie diese:

df[, !(colnames(df) %in% c("x","bar","foo"))]

67voto

Vincent Punkte 5493

List(NULL) funktioniert ebenfalls:

dat <- mtcars
colnames(dat)
# [1] "mpg"  "cyl"  "disp" "hp"   "drat" "wt"   "qsec" "vs"   "am"   "gear"
# [11] "carb"
dat[,c("mpg","cyl","wt")] <- list(NULL)
colnames(dat)
# [1] "disp" "hp"   "drat" "qsec" "vs"   "am"   "gear" "carb"

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