Appeler le nom d'une colonne stockée dans une autre variable

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

Aline Tavaud
Messages : 14
Enregistré le : 29 Jan 2021, 10:49

Appeler le nom d'une colonne stockée dans une autre variable

Messagepar Aline Tavaud » 24 Fév 2021, 16:03

Bonjour,

J'ai quelques soucis sur plusieurs codes que j'essaient d'écrire dont voici un exemple ci dessous.

En gros je ne sais pas comment faire lorsque je dois appeler le nom d'une colonne/variable lorsque le nom de celle ci est stocké dans une variable.

Dans cet exemple, j'ai un tableau avec plusieurs colonnes qui correspondent à des listes de gènes et je veux pouvoir faire tourner le code sur la liste/colonne que je choisie grâce à la fonction readline. Ici je veux créer une nouvelle colonne avec la fonction mutate en fonction de la colonne/liste de gène choisi mais le problème c'est qu'à ce moment, il ne comprend pas que gene_list c'est pas le nom de la colonne que je veux regarder mais que le nom correspond à la valeur qui est stockée dans cette variable et dans ce cas je ne sais pas comment faire.

La raison pour laquelle je veux proccéder ainsi c'est que je veux pas avoir a modifier tous mes programme avec le nom de la colonne que je souhaite regarder à chaque étape où elle apparait (là ce n'est que le début de mon code, mais ce problème ce répète sur de nombreuse lignes).

Y aurait - il un moyen simple de contourner ce problème ?

Exemple de tableau simplifié avec seulement trois colonnes

Code : Tout sélectionner

        Verif      List1           List2
1            aa                                             
2            dd   ; B3POI6            ; SPI7
3            dd                       ; PTOI2
4            aa                       ; PTOI2 ; PART4
5            uu    ; FLE45A1                 
6            dd                       ; AZE4B


Code : Tout sélectionner

gene_list=readline(prompt = "choisir la gène list")

a=which(colnames(tab) == gene_list)

tab=tab[,c(61,a)]

tab=tab %>%
  mutate(in_list=gene_list !="")


Merci d'avance pour les différentes pistes que vous pourrez me proposer

Aline

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

Re: Appeler le nom d'une colonne stockée dans une autre variable

Messagepar Mickael Canouil » 24 Fév 2021, 16:34

Bonjour,

Le code n'est pas du tout reproductible.


Ceci étant, il semblerait que vous utilisiez le tidyverse, en particulier dplyr, dans ce cas je vous oriente vers les opérateurs {{ }} ("curcly-curly") et !! ("bang-bang") et !!! ("bang-bang-bang") => "tidyeval"

PS : Au sujet du %>% ("pipe"), quand il n'y en a qu'un, c'est qu'il y en a un de trop.


EDIT :

Code : Tout sélectionner

df <- data.frame(
  x = 1:50,
  col1 = sample(c("", letters), 50, replace = TRUE),
  col2 = sample(c("", LETTERS), 50, replace = TRUE)
)

Code : Tout sélectionner

library(dplyr)
my_col <- readline(prompt = "Pick a column:")

out <- df %>% 
  select
(x, {{ my_col }}) %>% # select(x, .data[[my_col]]) or select(x, !!my_col)
  mutate(in_list = .data[[my_col]] != ""

Avec sym et !! (rlang)

Code : Tout sélectionner

library(dplyr)
my_col <- sym(readline(prompt "Pick a column:"))

out <- df %>% 
  
select(x, !!my_col) %>%
  
mutate(in_list = !!my_col != ""

Ou en "R base"

Code : Tout sélectionner

my_col <- readline(prompt = "Pick a column:")

out <- df[, c("x", my_col)]
out[["in_list"]] <- out[[my_col]] != "" 

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

Aline Tavaud
Messages : 14
Enregistré le : 29 Jan 2021, 10:49

Re: Appeler le nom d'une colonne stockée dans une autre variable

Messagepar Aline Tavaud » 24 Fév 2021, 16:53

Bonjour,

Merci beaucoup pour votre réponse, je vais regarder ces pistes et tester cela.
Désolée pour la non reproductibilité de mon code, je corrigerai tout ça si besoin de revenir vers vous.
Je suis d'accord pour le pipe mais en fait c'était juste un extrait, il y en a d'autre qui vont suivre ensuite.

Cordialement,

Aline

Aline Tavaud
Messages : 14
Enregistré le : 29 Jan 2021, 10:49

Re: Appeler le nom d'une colonne stockée dans une autre variable

Messagepar Aline Tavaud » 24 Fév 2021, 18:08

Re Bonjour,

Je viens de tester la première piste et cela marche parfaitement sur mes données ! C'est génial, merci beaucoup.
J'aimerai toutefois poser une autre question, car j'ai souvent essayé de faire des fonctions et il doit y avoir quelque chose que je ne comprends pas dans leur fonctionnement (je peux créer un nouveau topic si nécessaire).

J'ai essayé de reproduire mon problème grâce à vos données et au code que vous m'avez suggérez mais il n'y a rien qui se stock dans out à la fin, et je ne comprend pas comment faire pour que cela marche. Désolée je sais que c'est quelque chose qui à l'air très basique mais cela fait un moment que j'essaie de faire ce genre de chose et j'arrive jamais à stocker le résultat final de la fonction pour pouvoir m'en servir ensuite.

Merci d'avance pour vos éventuels éclaircissements

Cordialement

Aline

Code : Tout sélectionner

df <- data.frame(
  x = 1:50,
  col1 = sample(c("", letters), 50, replace = TRUE),
  col2 = sample(c("", LETTERS), 50, replace = TRUE)
)


Code : Tout sélectionner

library(dplyr)
 
ft=function(a){
 
  my_col <- readline(prompt = "Pick a column:")
 
  out <- df %>%
    select(x, {{ my_col }}) %>%
 
       mutate(in_list = .data[[my_col]] != "")
}

Aline Tavaud
Messages : 14
Enregistré le : 29 Jan 2021, 10:49

Re: Appeler le nom d'une colonne stockée dans une autre variable

Messagepar Aline Tavaud » 24 Fév 2021, 19:20

Re Re Bonjour,

Pour ma deuxième question, je pense avoir régler mon problème toute seule. Merci encore pour votre aide concernant mon premier message.

Cordialement,

Aline

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

Re: Appeler le nom d'une colonne stockée dans une autre variable

Messagepar Mickael Canouil » 25 Fév 2021, 08:56

Le "problème" vient de la dernière instruction de la fonction.
C'est cette dernière qui est renvoyée.
Cependant, le résultat est renvoyé de façon invisible par l'opérateur <-
Exemple :

Code : Tout sélectionner

<- function() {
  x <- 10 # equivalent to return(x <- 10)
}

f()

res <- f()
res
#> [1] 10

withVisible(f())
#> $value
#> [1] 10
#> 
#> $visible
#> [1] FALSE    


Pour "corriger", soit on retire l'affectation qui n'est pas utile ou on ajoute une ligne.

Code : Tout sélectionner

<- function() {
  10 # equivalent to return(10)
}

Code : Tout sélectionner

<- function() {
  x <- 10
  x
}


Et si on voulait vraiment que le résultat ne soit que renvoyer, mais pas afficher, plutôt qu'effectuer une affectation, il y a la fonction invisible()

Code : Tout sélectionner

<- function() {
  invisible(10) # or explicit return(invisible(10))
Mickaël
mickael.canouil.fr | rlille.fr

Aline Tavaud
Messages : 14
Enregistré le : 29 Jan 2021, 10:49

Re: Appeler le nom d'une colonne stockée dans une autre variable

Messagepar Aline Tavaud » 02 Mar 2021, 10:02

Bonjour,

Merci à nouveau pour votre réponse, je pense que je comprends mieux.

Aline


Retourner vers « Questions en cours »

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 1 invité