R dplyr: Mehrere Spalten löschen

96

Ich habe einen Datenrahmen und eine Liste von Spalten in diesem Datenrahmen, die ich löschen möchte. Verwenden wir den irisDatensatz als Beispiel. Ich würde gerne fallen Sepal.Lengthund Sepal.Widthnur die verbleibenden Spalten verwenden. Wie mache ich das mit selectoder select_aus dem dplyrPaket?

Folgendes habe ich bisher versucht:

drop.cols <- c('Sepal.Length', 'Sepal.Width')
iris %>% select(-drop.cols)

Fehler in -drop.cols: Ungültiges Argument für unären Operator

iris %>% select_(.dots = -drop.cols)

Fehler in -drop.cols: Ungültiges Argument für unären Operator

iris %>% select(!drop.cols)

Fehler in! Drop.cols: ungültiger Argumenttyp

iris %>% select_(.dots = !drop.cols)

Fehler in! Drop.cols: ungültiger Argumenttyp

Ich habe das Gefühl, dass mir etwas Offensichtliches fehlt, weil dies eine ziemlich nützliche Operation zu sein scheint, die es bereits geben sollte. Auf Github hat jemand ein ähnliches Problem gepostet , und Hadley sagte, er benutze "negative Indexierung". Das habe ich versucht (glaube ich), aber ohne Erfolg. Irgendwelche Vorschläge?

Navaneethan Santhanam
quelle

Antworten:

127

Überprüfen Sie die Hilfe zu select_vars. Das gibt Ihnen einige zusätzliche Ideen, wie Sie damit arbeiten können.

In deinem Fall:

iris %>% select(-one_of(drop.cols))
Phiver
quelle
Vielen Dank. Aus irgendeinem Grund funktioniert dies irisauf meinem tatsächlichen Datenrahmen ( iriswar jedoch ein Spielzeugbeispiel). Mein Datenrahmen enthält 4558 Zeilen und 147 Spalten. Die Fehlermeldung, die ich erhalten habe, war Error in eval(x$expr, data, x$env) : variable names are limited to 10000 bytes. Irgendeine Idee, warum dies passieren könnte?
Navaneethan Santhanam
1
Ah, sieht so aus, als hätte ich einen Fehler gemacht. Ich habe aus Versehen select_varsstatt select. Jetzt funktioniert es perfekt!
Navaneethan Santhanam
5
Wo sollen wir uns über eingebaute Funktionen wie informieren one_of? Sofern mir nichts fehlt, erscheint es nicht in der Paketdokumentation ( help(package='dplyr')).
Geotheory
4
@geotheory, tatsächlich ist one_of dokumentiert. siehe help(one_of, package = "dplyr"). Zumindest ist es in der Paketversion 0.5.0. Es ist jedoch hilfreich, die Blogs zu lesen, die Hadley veröffentlicht, wenn eines seiner Pakete aktualisiert wird. Einige Funktionen sind in anderen Funktionen dokumentiert. Leider erfordert dies das Lesen der gesamten Dokumentation, was ich meistens mache, wenn ich etwas möchte, das mit der Funktion nicht sofort offensichtlich oder möglich ist.
Phiver
10
Vielen Dank. Wie erfahren Sie in Bezug auf die Dokumentation überhaupt von diesen Funktionen?
Geotheory
66

probiere auch

## Notice the lack of quotes
iris %>% select (-c(Sepal.Length, Sepal.Width))
Miguel Rayon Gonzalez
quelle
5
Toll! Wirklich nützlich, wenn wir Spalten löschen müssen, indem wir die Namen von der Konsole kopieren und einfügen.
Pablo Casas
36

Darüber hinaus select(-one_of(drop.cols))gibt es einige andere Optionen zum Löschen von Spalten, bei select()denen nicht alle spezifischen Spaltennamen definiert werden (unter Verwendung der Beispieldaten von dplyr starwars für eine größere Vielfalt an Spaltennamen):

starwars %>% 
  select(-(name:mass)) %>%        # the range of columns from 'name' to 'mass'
  select(-contains('color')) %>%  # any column name that contains 'color'
  select(-starts_with('bi')) %>%  # any column name that starts with 'bi'
  select(-ends_with('er')) %>%    # any column name that ends with 'er'
  select(-matches('^f.+s$')) %>%  # any column name matching the regex pattern
  select_if(~!is.list(.)) %>%     # not by column name but by data type
  head(2)

# A tibble: 2 x 2
homeworld species
  <chr>     <chr>  
1 Tatooine  Human  
2 Tatooine  Droid 
sbha
quelle
Ist select_if(~!is.list(.))gleichbedeutend mit select_if(is.list(.))?
Jasha
3
In diesem Fall ~ist purrr eine Abkürzung für die Definition einer anonamen Funktion, es ist kein anderes Symbol für nicht. Zum Beispiel bedeuten diese beiden dasselbe function(x) {!is.list(x)}und ~!is.list(.). Betrachten Sie ~als Abkürzung für function(.).
SlyFox
8

Seien Sie vorsichtig mit der select()Funktion, da sie sowohl im dplyr- als auch im MASS-Paket verwendet wird. Wenn also MASS geladen ist, funktioniert select () möglicherweise nicht richtig. Um herauszufinden, welche Pakete geladen werden, geben Sie sie ein sessionInfo()und suchen Sie sie im Abschnitt "Andere angehängte Pakete:". Wenn es geladen ist detach( "package:MASS", unload = TRUE ), geben Sie ein und Ihre select()Funktion sollte wieder funktionieren.

Durand Sinclair
quelle
12
Alternativ können Sie auch direkt im Paket-Namespace auf die Funktion zugreifen dplyr::select().
Triamus
2
Ich bin zu oft auf dieses Problem gestoßen. Jetzt definiere ich normalerweise eine neue Funktion oben in meinem Skript dselect <- dplyr::select().
Filups21
5

Wir können es versuchen

iris %>% 
      select_(.dots= setdiff(names(.),drop.cols))
akrun
quelle
Danke @akrun, das hat perfekt funktioniert. Angesichts des Hype um dplyrdie Fähigkeit, grundlegende Analyseaufgaben einfach zu lesen und zu schreiben, bin ich jedoch enttäuscht, dass die eigentliche Lösung wie eine Problemumgehung aussieht.
Navaneethan Santhanam
@NavaneethanSanthanam Eigentlich ist die one_ofin der anderen Lösung der richtige Weg. Ich habe es vergessen.
Akrun
3

Eine andere Möglichkeit besteht darin, die unerwünschten Spalten zu mutieren. Dadurch werden NULLdie eingebetteten Klammern vermieden:

head(iris,2) %>% mutate_at(drop.cols, ~NULL)
#   Petal.Length Petal.Width Species
# 1          1.4         0.2  setosa
# 2          1.4         0.2  setosa
Moody_Mudskipper
quelle
Dies gibt auch keine Warnung aus, wenn keine Spalte vorhanden ist.
Skoz
3

Wenn Sie ein Sonderzeichen in den Spaltennamen haben, entweder selectoder select_möglicherweise nicht wie erwartet. Diese Eigenschaft dplyrder Verwendung ".". Um auf den Datensatz in der Frage zu verweisen, kann die folgende Zeile verwendet werden, um dieses Problem zu lösen:

drop.cols <- c('Sepal.Length', 'Sepal.Width')
  iris %>% .[,setdiff(names(.),drop.cols)]
Dineshram Mattapalli
quelle
Nur-Code-Antworten werden nicht empfohlen. Bitte erläutern Sie, wie die Antwort funktioniert und wie sie sich von den bereits vorhandenen Antworten unterscheidet.
Ralf Stubner
Danke dir!! Keine der anderen oben genannten Lösungen funktionierte genau aus diesem Grund.
Marty999
0

Du kannst es versuchen

iris %>% select(-!!drop.cols)
Lefty
quelle