web-dev-qa-db-fra.com

Sélectionnez les colonnes en fonction de la correspondance de chaîne - dplyr :: select

J'ai un cadre de données ("données") avec beaucoup, beaucoup de colonnes. Certaines colonnes contiennent une certaine chaîne ("chaîne_recherche").

Comment puis-je utiliser dplyr::select() pour me donner un sous-ensemble comprenant uniquement les colonnes contenant la chaîne?

J'ai essayé:

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

Ni l'un ni l'autre ne travaille.

Je sais que select() accepte les vecteurs numériques en remplacement des colonnes, par exemple:

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

Mais je ne sais pas comment obtenir un vecteur numérique de colonnes IDs à partir de mon expression grepl().

67
Timm S.

Dans le monde dplyr, essayez:

select(iris,contains("Sepal"))

Voir la section Sélection dans ?select pour de nombreux autres aides comme starts_with, ends_with, etc.

91
joran

Tu peux essayer:

select(data, matches("search_string"))

C’est plus général que contains - vous pouvez utiliser regex (par exemple, "one_string|or_the_other").

Pour plus d'exemples, voir: http://rpackages.ianhowson.com/cran/dplyr/man/select.html .

47
Piotr Migdal

Pas besoin d'utiliser select utilisez simplement [ au lieu

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

Essayons avec iris ensemble de données

>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
22
Jilber Urbina

Sur la base de la réponse de Piotr Migdals, je souhaite proposer une solution alternative permettant la création d’un vecteur de chaînes:

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

Utilisation de l'opérateur regex OR (|)

18
Boern