web-dev-qa-db-fra.com

Comment NE PAS sélectionner les colonnes en utilisant select () dplyr lorsque vous avez un vecteur de caractères de noms de colonnes?

J'essaie de désélectionner les colonnes de mon jeu de données à l'aide de dplyr, mais je ne suis pas en mesure d'y parvenir depuis hier soir.

Je connais bien le travail, mais j'essaie strictement de trouver une réponse uniquement via dplyr.

library(dplyr)
df <- tibble(x = c(1,2,3,4), y = c('a','b','c','d'))
df %>% select(-c('x'))

Me donne une erreur: Erreur dans -c ("x"): argument invalide à l'opérateur unaire

Maintenant, je sais que select prend des valeurs non cotées mais je ne suis pas en mesure de sous-sélectionner de cette façon.

Veuillez noter que l'ensemble de données ci-dessus n'est qu'un exemple, nous pouvons avoir plusieurs colonnes.

Merci,

Prerit

11
Prerit

Edit: la question réelle d'OP était de savoir comment utiliser un vecteur de caractères pour sélectionner ou désélectionner des colonnes d'une trame de données. Utilisez la fonction d'assistance one_of() pour cela:

colnames(iris)

# [1] "Sepal.Length" "Sepal.Width"  "Petal.Length" "Petal.Width"  "Species"

cols <- c("Petal.Length", "Sepal.Length")

select(iris, one_of(cols)) %>% colnames

# [1] "Petal.Length" "Sepal.Length"

select(iris, -one_of(cols)) %>% colnames

# [1] "Sepal.Width" "Petal.Width" "Species"

Vous devriez jeter un œil aux assistants sélectionnés (tapez ?select_helpers) Car ils sont incroyablement utiles. De la documentation:

starts_with(): commence par un préfixe

ends_with(): se termine par un préfixe

contains(): contient une chaîne littérale

matches(): correspond à une expression régulière

num_range(): une plage numérique comme x01, x02, x03.

one_of(): variables dans le vecteur de caractères.

everything(): toutes les variables.


Étant donné une trame de données avec des noms de colonnes a: z, utilisez select comme ceci:

select(-a, -b, -c, -d, -e)

# OR

select(-c(a, b, c, d, e))

# OR

select(-(a:e))

# OR if you want to keep b

select(-a, -(c:e))

# OR a different way to keep b, by just putting it back in

select(-(a:e), b)

Donc, si je voulais omettre deux des colonnes de l'ensemble de données iris, je pourrais dire:

colnames(iris)

# [1] "Sepal.Length" "Sepal.Width"  "Petal.Length" "Petal.Width"  "Species"

select(iris, -c(Sepal.Length, Petal.Length)) %>% colnames()

# [1] "Sepal.Width" "Petal.Width" "Species" 

Mais bien sûr, le meilleur moyen et le plus concis pour y parvenir est d'utiliser l'une des fonctions d'assistance de select:

select(iris, -ends_with(".Length")) %>% colnames()

# [1] "Sepal.Width" "Petal.Width" "Species"   

P.S. C'est bizarre que vous passiez des valeurs entre guillemets à dplyr, une de ses grandes subtilités est que vous pas devez continuer à taper des guillemets tout le temps. Comme vous pouvez le voir, les valeurs nues fonctionnent correctement avec dplyr et ggplot2.

19
DuckPyjamas