[Résolu] Utiliser le contenu d'une variable et non son nom dans une commande dplyr.

Postez ici vos questions, réponses, commentaires ou suggestions - Les sujets seront ultérieurement répartis dans les archives par les modérateurs

Modérateur : Groupe des modérateurs

Jean-Emmanuel Longueville
Messages : 310
Enregistré le : 23 Fév 2011, 08:03

[Résolu] Utiliser le contenu d'une variable et non son nom dans une commande dplyr.

Messagepar Jean-Emmanuel Longueville » 10 Fév 2020, 10:06

Bonjour,

J'ai une question concernant la ligne de code suivante :

Code : Tout sélectionner

tabl %>% group_by(animal) %>% summarise( choc  = mean(discVar, na.rm = TRUE))


En effet la chaîne de caractère discVar ne fait pas parti des names(tabl) mais la variable discVar elle est bien dans les names du tabl. Comment forcer R à prendre la valeur de la variable et non le nom de celle ci ?

Merci
Jean-Emmanuel
Ingénieur d'étude LNEC

Mickael Canouil
Messages : 1315
Enregistré le : 04 Avr 2011, 08:53
Contact :

Re: Utiliser le contenu d'une variable et non son nom dans une commande dplyr.

Messagepar Mickael Canouil » 10 Fév 2020, 10:45

Bonjour,

la réponse est BANG BANG !! ou CURLY CURLY {{ }}

Code : Tout sélectionner

Sepal.Length <- "Petal.Length" 


Code : Tout sélectionner

head(dplyr::select(irisSepal.Length))
#>   Sepal.Length
#> 1          5.1
#> 2          4.9
#> 3          4.7
#> 4          4.6
#> 5          5.0
#> 6          5.4
 

Code : Tout sélectionner

head(dplyr::select(iris, !!Sepal.Length))
#>   Petal.Length
#> 1          1.4
#> 2          1.4
#> 3          1.3
#> 4          1.5
#> 5          1.4
#> 6          1.7
 

Code : Tout sélectionner

head(dplyr::select(iris, {{Sepal.Length}}))
#>   Petal.Length
#> 1          1.4
#> 2          1.4
#> 3          1.3
#> 4          1.5
#> 5          1.4
#> 6          1.7
 


Cordialement,
Mickaël
mickael.canouil.fr | rlille.fr

Jean-Emmanuel Longueville
Messages : 310
Enregistré le : 23 Fév 2011, 08:03

Re: Utiliser le contenu d'une variable et non son nom dans une commande dplyr.

Messagepar Jean-Emmanuel Longueville » 10 Fév 2020, 10:50

Ah merci beaucoup je ne connaissais pas du tout ces opérateurs aux noms explosifs :D

Edith :
Je suis aller un peu vite en besogne en disant résolu :

Code : Tout sélectionner

iris %>% group_by(Species) %>% summarise(choc = mean(!!toto, na.rm = TRUE) )

Ce code me retourne que des NA
Jean-Emmanuel
Ingénieur d'étude LNEC

Mickael Canouil
Messages : 1315
Enregistré le : 04 Avr 2011, 08:53
Contact :

Re: [Résolu] Utiliser le contenu d'une variable et non son nom dans une commande dplyr.

Messagepar Mickael Canouil » 10 Fév 2020, 10:54

j'ai oublié l'usage du "pronom" .data (utile surtout pour éviter les erreurs du CRAN check pour les packages.

Code : Tout sélectionner

head(dplyr::select(iris, .data[[Sepal.Length]]))
#>   Petal.Length
#> 1          1.4
#> 2          1.4
#> 3          1.3
#> 4          1.5
#> 5          1.4
#> 6          1.7 
Mickaël
mickael.canouil.fr | rlille.fr

Jean-Emmanuel Longueville
Messages : 310
Enregistré le : 23 Fév 2011, 08:03

Re: [Résolu] Utiliser le contenu d'une variable et non son nom dans une commande dplyr.

Messagepar Jean-Emmanuel Longueville » 10 Fév 2020, 10:57

Ok et absolument nécessaire dans d'autre cas avec le pronom tout fonctionne merci.
Jean-Emmanuel
Ingénieur d'étude LNEC

Jean-Emmanuel Longueville
Messages : 310
Enregistré le : 23 Fév 2011, 08:03

Re: [Résolu] Utiliser le contenu d'une variable et non son nom dans une commande dplyr.

Messagepar Jean-Emmanuel Longueville » 10 Fév 2020, 11:11

Du coup Mickael une seconde question lié comment écrire se genre de code :

Code : Tout sélectionner

 tabs <- subset(tabl, tabl$Day %in% unique(tabl$Day)[1:2])
  if(discVar == "sommechoc")  { grpval <- c("gca2", "gca3", "gcmd")
  } else if(discVar == "PR")  { grpval <- c("gpa2", "gpa3", "gpmd")}
 
      tabl <- tabl %>% rename(.data[[grpval[1]]] = gxa2, .data[[grpval[1]]] = gxa3, .data[[grpval[1]]] = gxmd)
 
 

Dont l'objectif est de nommé trois colonnes en fonction des noms contenu dans un vecteur ?
Jean-Emmanuel
Ingénieur d'étude LNEC

Mickael Canouil
Messages : 1315
Enregistré le : 04 Avr 2011, 08:53
Contact :

Re: [Résolu] Utiliser le contenu d'une variable et non son nom dans une commande dplyr.

Messagepar Mickael Canouil » 10 Fév 2020, 11:31

Je ne suis pas certain de comprendre la structure de départ et d'arrivée.
rename() renomme des colonnes, il ne permet pas d'en générer de nouvelles.

Sinon, j'ai l'impression qu'on serait sur un usage de l'opérateur :=

Code : Tout sélectionner

library(dplyr)
iris2 <- as_tibble(iris)
varname <- "Petal.Length2"
dplyr::mutate(iris2, !!varname := Petal.Length)
#> # A tibble: 150 x 6
#>    Sepal.Length Sepal.Width Petal.Length Petal.Width Species Petal.Length2
#>           <dbl>       <dbl>        <dbl>       <dbl> <fct>           <dbl>
#>  1          5.1         3.5          1.4         0.2 setosa            1.4
#>  2          4.9         3            1.4         0.2 setosa            1.4
#>  3          4.7         3.2          1.3         0.2 setosa            1.3
#>  4          4.6         3.1          1.5         0.2 setosa            1.5
#>  5          5           3.6          1.4         0.2 setosa            1.4
#>  6          5.4         3.9          1.7         0.4 setosa            1.7
#>  7          4.6         3.4          1.4         0.3 setosa            1.4
#>  8          5           3.4          1.5         0.2 setosa            1.5
#>  9          4.4         2.9          1.4         0.2 setosa            1.4
#> 10          4.9         3.1          1.5         0.1 setosa            1.5
#> # … with 140 more rows 
Mickaël
mickael.canouil.fr | rlille.fr

Jean-Emmanuel Longueville
Messages : 310
Enregistré le : 23 Fév 2011, 08:03

Re: [Résolu] Utiliser le contenu d'une variable et non son nom dans une commande dplyr.

Messagepar Jean-Emmanuel Longueville » 10 Fév 2020, 12:48

Merci pour mieux expliquer mon pb je crée trois nouvelle colonne qui de base s'appelle gxa1, gxa2, gxa3 et en fonction d'une variable je cherche à les renommer gca1,2,3 ou gpa1,2,3. D'où j'étais partie sur l'idée de faire un vecteur contenant gca1, gca2, gca3 et un autre contenant gpa1, gpa2, gpa3. Et après avoir fait les colonnes les renomer.
Jean-Emmanuel
Ingénieur d'étude LNEC

Mickael Canouil
Messages : 1315
Enregistré le : 04 Avr 2011, 08:53
Contact :

Re: [Résolu] Utiliser le contenu d'une variable et non son nom dans une commande dplyr.

Messagepar Mickael Canouil » 10 Fév 2020, 13:35

On serait bien sur l'opérateur :=, mais sans le .data
Comment est construit discVar ? J'ai comme l'impression qu'il y a une approche plus simple (ou efficace).
Un exemple reproductible avec un extrait du jeu de donnée ?

Code : Tout sélectionner

library(dplyr)
iris2 <- as_tibble(iris)
varname <- "setosa" 


BANG BANG ou CURLY CURLY

Code : Tout sélectionner

dplyr::rename(iris2, .data[[varname]] := Petal.Length)
#> Error: Can't use the `.data` pronoun on the LHS of `:=` 


Code : Tout sélectionner

dplyr::rename(iris2, !!varname := Petal.Length)
#> # A tibble: 150 x 5
#>    Sepal.Length Sepal.Width setosa Petal.Width Species
#>           <dbl>       <dbl>  <dbl>       <dbl> <fct>  
#>  1          5.1         3.5    1.4         0.2 setosa 
#>  2          4.9         3      1.4         0.2 setosa 
#>  3          4.7         3.2    1.3         0.2 setosa 
#>  4          4.6         3.1    1.5         0.2 setosa 
#>  5          5           3.6    1.4         0.2 setosa 
#>  6          5.4         3.9    1.7         0.4 setosa 
#>  7          4.6         3.4    1.4         0.3 setosa 
#>  8          5           3.4    1.5         0.2 setosa 
#>  9          4.4         2.9    1.4         0.2 setosa 
#> 10          4.9         3.1    1.5         0.1 setosa 
#> # … with 140 more rows 
Mickaël
mickael.canouil.fr | rlille.fr

Jean-Emmanuel Longueville
Messages : 310
Enregistré le : 23 Fév 2011, 08:03

Re: [Résolu] Utiliser le contenu d'une variable et non son nom dans une commande dplyr.

Messagepar Jean-Emmanuel Longueville » 10 Fév 2020, 14:00

Discvar est un argument d'une fonction
Jean-Emmanuel
Ingénieur d'étude LNEC

Mickael Canouil
Messages : 1315
Enregistré le : 04 Avr 2011, 08:53
Contact :

Re: [Résolu] Utiliser le contenu d'une variable et non son nom dans une commande dplyr.

Messagepar Mickael Canouil » 10 Fév 2020, 14:23

Par exemple :

Code : Tout sélectionner

library(dplyr)
iris2 <- as_tibble(iris


Code : Tout sélectionner

<- function(datax) {
 
current_colnames <- c("Sepal.Length""Sepal.Width""Petal.Length""Petal.Width")
 
 
new_colnames <- switch(x,
    
"AA" paste0("AA_"current_colnames),
    
"BB" paste0("BB_"current_colnames),
    
stop(paste0("Values not defined for x="x))
 )
 
names(current_colnames) <- new_colnames
 
 dplyr
::rename(dataall_of(current_colnames)) # ou dplyr::rename(data, !!!current_colnames)


Code : Tout sélectionner

f(iris2"AA")
#> # A tibble: 150 x 5
#>    AA_Sepal.Length AA_Sepal.Width AA_Petal.Length AA_Petal.Width Species
#>              <dbl>          <dbl>           <dbl>          <dbl> <fct>  
#>  1             5.1            3.5             1.4            0.2 setosa 
#>  2             4.9            3               1.4            0.2 setosa 
#>  3             4.7            3.2             1.3            0.2 setosa 
#>  4             4.6            3.1             1.5            0.2 setosa 
#>  5             5              3.6             1.4            0.2 setosa 
#>  6             5.4            3.9             1.7            0.4 setosa 
#>  7             4.6            3.4             1.4            0.3 setosa 
#>  8             5              3.4             1.5            0.2 setosa 
#>  9             4.4            2.9             1.4            0.2 setosa 
#> 10             4.9            3.1             1.5            0.1 setosa 
#> # … with 140 more rows 

Code : Tout sélectionner

f(iris2"BB")
#> # A tibble: 150 x 5
#>    BB_Sepal.Length BB_Sepal.Width BB_Petal.Length BB_Petal.Width Species
#>              <dbl>          <dbl>           <dbl>          <dbl> <fct>  
#>  1             5.1            3.5             1.4            0.2 setosa 
#>  2             4.9            3               1.4            0.2 setosa 
#>  3             4.7            3.2             1.3            0.2 setosa 
#>  4             4.6            3.1             1.5            0.2 setosa 
#>  5             5              3.6             1.4            0.2 setosa 
#>  6             5.4            3.9             1.7            0.4 setosa 
#>  7             4.6            3.4             1.4            0.3 setosa 
#>  8             5              3.4             1.5            0.2 setosa 
#>  9             4.4            2.9             1.4            0.2 setosa 
#> 10             4.9            3.1             1.5            0.1 setosa 
#> # … with 140 more rows 
Mickaël
mickael.canouil.fr | rlille.fr


Retourner vers « Questions en cours »

Qui est en ligne

Utilisateurs parcourant ce forum : Google [Bot] et 1 invité