1046 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.

25voto

jkeirstead Punkte 2731

Interessanterweise weist dies auf eine der seltsamen mehrfachen Syntax-Ungereimtheiten von R hin. Zum Beispiel bei einem zweispaltigen Datenrahmen:

df <- data.frame(x=1, y=2)

Dies ergibt einen Datenrahmen

subset(df, select=-y)

aber dies ergibt einen Vektor

df[,-2]

Dies alles wird erklärt in ?[ aber das ist nicht gerade ein erwartetes Verhalten. Nun, zumindest nicht für mich...

25voto

Kun Ren Punkte 4377
DF <- data.frame(
  x=1:10,
  y=10:1,
  z=rep(5,10),
  a=11:20
)
DF

Ausgabe:

    x  y z  a
1   1 10 5 11
2   2  9 5 12
3   3  8 5 13
4   4  7 5 14
5   5  6 5 15
6   6  5 5 16
7   7  4 5 17
8   8  3 5 18
9   9  2 5 19
10 10  1 5 20

DF[c("a","x")] <- list(NULL)

Ausgabe:

        y z
    1  10 5
    2   9 5
    3   8 5
    4   7 5
    5   6 5
    6   5 5
    7   4 5
    8   3 5    
    9   2 5
    10  1 5

22voto

c.gutierrez Punkte 4392

Hier ist ein dplyr Weg, dies zu tun:

#df[ -c(1,3:6, 12) ]  # original
df.cut <- df %>% select(-col.to.drop.1, -col.to.drop.2, ..., -col.to.drop.6)  # with dplyr::select()

Ich mag das, weil es intuitiv zu lesen und zu verstehen ist, ohne Anmerkungen und robust gegenüber Spalten, die ihre Position innerhalb des Datenrahmens ändern. Es folgt auch dem vektorisierten Idiom mit - um Elemente zu entfernen.

16voto

JD Long Punkte 57096

Ich denke immer wieder, dass es eine bessere Redewendung geben muss, aber für die Subtraktion von Spalten nach Namen neige ich zu folgendem Vorgehen:

df <- data.frame(a=1:10, b=1:10, c=1:10, d=1:10)

# return everything except a and c
df <- df[,-match(c("a","c"),names(df))]
df

13voto

krlmlr Punkte 23448

Es gibt eine Funktion namens dropNamed() in Bernd Bischl's BBmisc Paket, das genau dies tut.

BBmisc::dropNamed(df, "x")

Der Vorteil ist, dass die Wiederholung des Datenrahmenarguments vermieden wird und daher für die Einbindung in Rohrleitungen geeignet ist magrittr (genau wie die dplyr Ansätze):

df %>% BBmisc::dropNamed("x")

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