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.

48voto

IRTFM Punkte 250762

Es gibt eine potenziell leistungsfähigere Strategie, die auf der Tatsache beruht, dass grep() einen numerischen Vektor zurückgibt. Wenn Sie eine lange Liste von Variablen haben, wie ich in einem meiner Datensätze, einige Variablen, die auf ".A" enden, und andere, die auf ".B" enden, und Sie wollen nur die, die auf ".A" enden (zusammen mit allen Variablen, die keinem der beiden Muster entsprechen), tun Sie Folgendes:

dfrm2 <- dfrm[ , -grep("\\.B$", names(dfrm)) ]

Im vorliegenden Fall, dem Beispiel von Joris Mey, ist es vielleicht nicht so kompakt, aber es wäre es:

DF <- DF[, -grep( paste("^",drops,"$", sep="", collapse="|"), names(DF) )]

48voto

mnel Punkte 109980

Wenn Sie die Spalten per Referenz entfernen und das interne Kopieren vermeiden wollen, das mit data.frames dann können Sie die data.table Paket und die Funktion :=

Sie können einen Zeichenvektor-Namen an die linke Seite des Befehls := Betreiber, und NULL als die RHS.

library(data.table)

df <- data.frame(a=1:10, b=1:10, c=1:10, d=1:10)
DT <- data.table(df)
# or more simply  DT <- data.table(a=1:10, b=1:10, c=1:10, d=1:10) #

DT[, c('a','b') := NULL]

Wenn Sie die Namen als Zeichenvektor außerhalb des Aufrufs von [ verpacken Sie den Namen des Objekts in () ou {} um zu erzwingen, dass der LHS im aufrufenden Bereich ausgewertet wird und nicht als Name im Bereich von DT .

del <- c('a','b')
DT <- data.table(a=1:10, b=1:10, c=1:10, d=1:10)
DT[, (del) := NULL]
DT <-  <- data.table(a=1:10, b=1:10, c=1:10, d=1:10)
DT[, {del} := NULL]
# force or `c` would also work.   

Sie können auch Folgendes verwenden set was den Overhead von [.data.table , und arbeitet auch für data.frames !

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

# drop `a` from df (no copying involved)

set(df, j = 'a', value = NULL)
# drop `b` from DT (no copying involved)
set(DT, j = 'b', value = NULL)

45voto

Pat W. Punkte 1771

Eine weitere dplyr Antwort. Verwenden Sie select(-column) .

Wenn Ihre Variablen eine gemeinsame Namensstruktur haben, können Sie versuchen starts_with() . Zum Beispiel

library(dplyr)
df <- data.frame(var1 = rnorm(5), var2 = rnorm(5), var3 = rnorm (5), 
                 var4 = rnorm(5), char1 = rnorm(5), char2 = rnorm(5))
df
#        var2      char1        var4       var3       char2       var1
#1 -0.4629512 -0.3595079 -0.04763169  0.6398194  0.70996579 0.75879754
#2  0.5489027  0.1572841 -1.65313658 -1.3228020 -1.42785427 0.31168919
#3 -0.1707694 -0.9036500  0.47583030 -0.6636173  0.02116066 0.03983268

df1 <- df %>% select(-starts_with("char"))

df1
#        var2        var4       var3       var1
#1 -0.4629512 -0.04763169  0.6398194 0.75879754
#2  0.5489027 -1.65313658 -1.3228020 0.31168919
#3 -0.1707694  0.47583030 -0.6636173 0.03983268

Wenn Sie eine Folge von Variablen im Datenrahmen löschen möchten, können Sie : . Wenn Sie zum Beispiel Folgendes fallen lassen wollen var2 , var3 y tous Variablen dazwischen, bliebe Ihnen nur var1 :

df2 <- df1 %>% select(-c(var2:var3) )  
df2
#        var1
#1 0.75879754
#2 0.31168919
#3 0.03983268

39voto

Preston Punkte 6200

Dplyr-Lösung

Ich bezweifle, dass dies hier unten viel Beachtung finden wird, aber wenn Sie eine Liste von Spalten haben, die Sie entfernen möchten, und dies in einem dplyr Kette Ich benutze one_of() において select Klausel:

Hier ist ein einfaches, reproduzierbares Beispiel:

undesired <- c('mpg', 'cyl', 'hp')

mtcars <- mtcars %>%
  select(-one_of(undesired))

Die Dokumentation finden Sie durch Ausführen von ?one_of oder hier:

http://genomicsclass.github.io/book/pages/dplyr_tutorial.html

28voto

scentoni Punkte 689

Eine andere Möglichkeit:

df <- df[, setdiff(names(df), c("a", "c"))]

oder

df <- df[, grep('^(a|c)$', names(df), invert=TRUE)]

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