Wählen Sie Spalten basierend auf der Zeichenfolgenübereinstimmung aus - dplyr :: select


83

Ich habe einen Datenrahmen ("Daten") mit vielen, vielen Spalten. Einige der Spalten enthalten eine bestimmte Zeichenfolge ("search_string").

Wie kann ich dplyr::select()eine Teilmenge angeben, die nur die Spalten enthält, die die Zeichenfolge enthalten?

Ich habe es versucht:

# columns as boolean vector
select(data, grepl("search_string",colnames(data)))

# columns as vector of column names names 
select(data, colnames(data)[grepl("search_string",colnames(data))]) 

Keiner von ihnen arbeitet.

Ich weiß, dass select()numerische Vektoren als Ersatz für Spalten akzeptiert werden, z.

select(data,5,7,9:20)

Aber ich weiß nicht, wie ich IDaus meinem grepl()Ausdruck einen numerischen Vektor von Spalten s erhalten kann.


Siehe auch diese SO-Antwort für mehrere Zeichenfolgen und Übereinstimmungen: stackoverflow.com/q/29018292/3871924
agenis

Antworten:


112

Versuchen Sie in der dplyr- Welt:

select(iris,contains("Sepal"))

Siehe Abschnitt Auswahl in dem ?selectfür zahlreiche andere Helfer wie starts_with, ends_withusw.


2
Beachten Sie, dass Sie mit diesem pfuschen kann ganz einfach wie zu vermeiden regex versuchen, regex Sie zu beißen zurück kommt, zum Beispiel: select(iris, contains(".") )Nicht sicher , wie Sie sollen passieren fixed=TRUEfür eine tatsächliche zu erzwingen suchen"."
thelatemail

1
@thelatemail Das fühlt sich entweder im Code oder in den Dokumenten wie ein Versehen an (dh nehmen wir an fixed = TRUEoder das Äquivalent). dplyr ist noch ziemlich jung.
Joran

@ thelatemail Ups! Ich habe das auch so gemacht!
Joran

6
Nun, das ist dann ein ziemlich lahmer Start in meine Github-Karriere. 'Als Duplikat schließen' kommt bald!
E-Mail

1
@ MattBannert siehe die Lösung, die ich bereitgestellt habe
Boern


30

Keine Notwendigkeit, stattdessen selectnur zu verwenden[

data[,grepl("search_string", colnames(data))]

Versuchen wir es mit dem irisDatensatz

>iris[,grepl("Sepal", colnames(iris))]
  Sepal.Length Sepal.Width
1          5.1         3.5
2          4.9         3.0
3          4.7         3.2
4          4.6         3.1
5          5.0         3.6
6          5.4         3.9

6
@arumbay dplyrist ein Panceum - selbst wenn Sie es tun können base, ist die Standardsyntax nicht so schön / lesbar / zusammensetzbar - siehe meine Antwort .
Piotr Migdal

20

Basierend auf der Antwort von Piotr Migdals möchte ich eine alternative Lösung geben, die die Möglichkeit eines Vektors von Zeichenfolgen ermöglicht:

myVectorOfStrings <- c("foo", "bar")
matchExpression <- paste(myVectorOfStrings, collapse = "|")
# [1] "foo|bar"
df %>% select(matches(matchExpression))

Verwendung des Regex- OROperators ( |)

ACHTUNG : Wenn Sie wirklich einen einfachen Vektor mit Spaltennamen haben (und nicht die Leistung von RegExpression benötigen), lesen Sie bitte den Kommentar unter dieser Antwort (da dies die sauberere Lösung ist).


5
Verwenden select(df, one_of(array_of_colnames))
Sie
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.