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?

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))

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))

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 

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.


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))

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

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)]

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)
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.