2015-03-12 23 views
18

Ich möchte mehrere Spalten anhand ihrer Namen mit einem Regex Ausdruck auswählen. Ich versuche es mit der Piping-Syntax des dplyr-Pakets. Ich habe die anderen Themen überprüft, aber nur Antworten zu einer einzelnen Zeichenfolge gefunden.wählen Sie Spalten basierend auf mehreren Zeichenfolgen mit dplyr enthält()

Mit Base R:

library(dplyr)  
mtcars[grepl('m|ar', names(mtcars))] 
###      mpg am gear carb 
### Mazda RX4   21.0 1 4 4 
### Mazda RX4 Wag  21.0 1 4 4 

Allerdings ist es nicht mit der Auswahl arbeiten/enthält Art und Weise:

mtcars %>% select(contains('m|ar')) 
### data frame with 0 columns and 32 rows 

Was ist los?

Antwort

34

können Sie verwenden matches

mtcars %>% 
     select(matches('m|ar')) %>% 
     head(2) 
#    mpg am gear carb 
#Mazda RX4  21 1 4 4 
#Mazda RX4 Wag 21 1 4 4 

Nach der ?select Dokumentation

'Streichhölzer (x, ignore.case = TRUE)': alle Variablen, deren wählt Name dem regulären Ausdruck ' x '

Obwohl contains mit einem einzigen stri arbeiten ng

mtcars %>% 
     select(contains('m')) 
+0

Danke @akrun, ich fühle mich jetzt blöd :-). Aber eine Frage, immer noch: Warum sollten wir sogar contains() verwenden, wenn matches() das Gleiche und noch besser macht? – agenis

+0

@agenis Es gibt mehrere Optionen in '? Select' für die Flexibilität der Verwendung, denke ich. 'contains' nimmt eine einzelne Zeichenkette, aber wenn Sie diesen Regextyp-Abgleich durchführen, ist es besser, 'matches' zu verwenden ... – akrun

+1

@agenis Weil Sie vielleicht". " und muss nicht darüber nachdenken, wie man es in einem regulären Ausdruck zu entkommen – hadley

Verwandte Themen