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.

Timm S.
quelle
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.

Joran
quelle
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
59

Du kannst es versuchen:

select(data, matches("search_string"))

Es ist allgemeiner als contains- Sie können Regex verwenden (z "one_string|or_the_other". B. ).

Weitere Beispiele finden Sie unter: http://rpackages.ianhowson.com/cran/dplyr/man/select.html .

Piotr Migdal
quelle
1
besser , da regexp Unterstützung
Boern
Der Link ist jetzt unten
pratikpc
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
Jilber Urbina
quelle
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).

Boern
quelle
5
Verwenden select(df, one_of(array_of_colnames))
Sie