IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

R Discussion :

Match entre valeurs d'une colonne et valeurs d'un vecteur


Sujet :

R

  1. #1
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Janvier 2021
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 32
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2021
    Messages : 18
    Points : 13
    Points
    13
    Par défaut Match entre valeurs d'une colonne et valeurs d'un vecteur
    Bonjour,

    Je sollicite votre aide pour une opération que je n'arrive pas à réaliser.

    J'ai ce tableau

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    res= data.frame(cas=c("A", "B", "C"), gene=c("AJUD,AUJTG,UYTRR", "FRTY", "ADERT,FERT,OPOIU"))
     
      cas             gene
    1   A AJUD,AUJTG,UYTRR
    2   B             FRTY
    3   C ADERT,FERT,OPOIU
    et cette liste de gènes

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    TD_gene=c("UYTRR", "FERT","OPOIU")
    [1] "UYTRR" "FERT"  "OPOIU"
    et j'aimerai pouvoir obtenir le tableau suivant, soit le même tableau qu'au début mais avec une nouvelle colonne indiquant les gènes de la deuxième colonne présent dans la liste de gène TD

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    res2= data.frame(cas=c("A", "B", "C"), gene=c("AJUD,AUJTG,UYTRR", "FRTY", "ADERT,FERT,OPOIU"), gene_TD=c("UYTRR", "", "FERT,OPOIU"))
      cas             gene    gene_TD
    1   A AJUD,AUJTG,UYTRR      UYTRR
    2   B             FRTY           
    3   C ADERT,FERT,OPOIU FERT,OPOIU
    Je voulais utiliser la fonction mutate de tydiverse et la fonction grep mais je ne sais pas trop comment proccéder.

    Quelqu'un aurait une idée,

    Merci d'avance,

    Aline

  2. #2
    Expert confirmé
    Avatar de olivier.decourt
    Homme Profil pro
    Formateur R/SAS/statistiques
    Inscrit en
    Avril 2008
    Messages
    2 064
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Activité : Formateur R/SAS/statistiques
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 064
    Points : 4 478
    Points
    4 478
    Par défaut
    Bonjour.
    Avec l'équivalent de grep dans {stringr}, une fonction appelée str_match_all.
    Le problème est le type du résultat, une liste de valeurs qu'il faut ensuite transformer pour qu'elle soit comme dans votre exemple (avec paste et l'option collapse). Le rowwise + ungroup est là pour indiquer qu'on travaille ligne par ligne dans les données (surtout pour paste qui sinon va concaténer tous les contenus de la colonne).
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    library(tidyverse)
    library(stringr)
     
    res <- data.frame(cas=c("A", "B", "C"), gene=c("AJUD,AUJTG,UYTRR", "FRTY", "ADERT,FERT,OPOIU"))
    TD_gene <- c("UYTRR", "FERT","OPOIU")
     
    res %>% 
      rowwise() %>% 
      mutate(gene_TD = str_match_all(gene, {{TD_gene}}) %>% unlist() %>% paste(collapse=",")) %>% 
      ungroup()
    Il y a peut-être plus simple.
    Bon courage.
    Olivier

  3. #3
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Janvier 2021
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 32
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2021
    Messages : 18
    Points : 13
    Points
    13
    Par défaut
    Bonjour,

    Ca m'a l'air déjà très bien comme ça.
    Merci beaucoup.

    Aline

  4. #4
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Janvier 2021
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 32
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2021
    Messages : 18
    Points : 13
    Points
    13
    Par défaut
    Rebonjour,

    Finalement, cela marche bien mais je n'avais pas prévu la source d'erreur suivante:
    quand le nom d'un gène est composé par le début d'un autre comme dans l'exemple ci dessous: "AJU" et "AJUD".
    Car dans ce cas, ça place le gène AJU dans la colonne TD alors que ce n'est pas le même gène.
    Je vais essayer de voir comment adapter votre code, mais si quelqu'un à une idée, je prends.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
     
    library(tidyverse)
    library(stringr)
     
    res <- data.frame(cas=c("A", "B", "C"), gene=c("AJUD,AUJTG,UYTRR", "FRTY", "ADERT,FERT,OPOIU"))
    TD_gene <- c("UYTRR", "FERT","OPOIU", "AJU")
     
    res %>% 
      rowwise() %>% 
      mutate(gene_TD = str_match_all(gene, {{TD_gene}}) %>% unlist() %>% paste(collapse=",")) %>% 
      ungroup()
     
     cas   gene             gene_TD     
      <chr> <chr>            <chr>       
    1 A     AJUD,AUJTG,UYTRR "UYTRR,AJU" 
    2 B     FRTY             ""          
    3 C     ADERT,FERT,OPOIU "FERT,OPOIU"
    >
    Merci d'avance,

    Aline

  5. #5
    Expert confirmé
    Avatar de olivier.decourt
    Homme Profil pro
    Formateur R/SAS/statistiques
    Inscrit en
    Avril 2008
    Messages
    2 064
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Activité : Formateur R/SAS/statistiques
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 064
    Points : 4 478
    Points
    4 478
    Par défaut
    Bonjour.
    Dans ce cas je pense que le plus fiable serait de réorganiser les données : éclater la variable contenant la liste de gènes en plusieurs colonnes (avec tidyr::separate par exemple) puis mettre les données "en hauteur" avec tidyr::pivot_longer ou reshape2::melt. Il y aura alors un gène par ligne, vous pourrez plus facilement tester leur présence / absence dans la liste fixe.
    Bon courage.
    Olivier

Discussions similaires

  1. Réponses: 6
    Dernier message: 12/12/2020, 20h56
  2. Stocker Une colonne sans Doublons dans un Vecteur ou tableau
    Par rampage92 dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 14/12/2016, 14h14
  3. Soustraction entre valeur d'un vecteur
    Par rock_kader dans le forum MATLAB
    Réponses: 7
    Dernier message: 15/08/2013, 22h24
  4. Réponses: 3
    Dernier message: 01/04/2009, 21h22
  5. Compter les entrées unique d'une colonne.
    Par HabsWarrior dans le forum Macros et VBA Excel
    Réponses: 11
    Dernier message: 11/09/2008, 16h52

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo