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 :

Appliquer des actions sur plusieurs jeux de données


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 Appliquer des actions sur plusieurs jeux de données
    Bonjour,

    J'aimerai appliquer une série d'action sur plusieurs colonnes d'un tableau dont vous avez les premières lignes ci dessous mais j'ai du mal à utiliser le système de fonction, si quelqu'un voulait bien m'aiguiller.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
      verification1 vérification2        verification3 verification4 verification5
    1          <NA>          <NA>                 <NA>          <NA>        Absent
    2          <NA>          <NA>               DeNovo          <NA>        DeNovo
    3          <NA>          <NA>                 <NA>          <NA>        DeNovo
    4          <NA>          <NA>                 <NA>          <NA>        Absent
    5          <NA>          <NA> Paternal_Inheritance          <NA>        DeNovo
    6        DeNovo          <NA>               DeNovo          <NA>        DeNovo
    La série d'action à réalisé est toute simple (et pourrait également être simplifié grâce à vos différents conseils). J'aimerai pour chaque colonne calculer le % de catégorie sachant que certaines cases sont vide. Ci dessous mes lignes de code appliquées à une colonne


    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
    19
    DeNovo_1=sum(tab$Variant_Type=="SNV" & tab2$verification1=="DeNovo")
    Uncertain_1_SNV=sum(tab$Variant_Type=="SNV" & tab2$verification1=="Uncertain")
    Absent_1_SNV=sum(tab$Variant_Type=="SNV" & tab2$verification1=="Absent") 
    Maternal_1_SNV=sum(tab$Variant_Type=="SNV" & tab2$verification1=="Maternal_Inheritance")
    Paternal_1_SNV=sum(tab$Variant_Type=="SNV" & tab2$verification1=="Paternal_Inheritance") 
     
    DeNovo_1
    Absent_1
    Uncertain_1
    Maternal_1
    Paternal_1
     
    Done_1= DeNovo_1 + Absent_1 + Uncertain_1 + Maternal_1 + Paternal_1
     
    pourc_DeNovo_1=DeNovo_1/Done_1 * 100
    pourc_Uncertain_1=Uncertain_1/Done_1 * 100
    pourc_Absent_1=Absent_1/Done_1 * 100
    pourc_Maternal_1=Maternal_1/Done_1 * 100
    pourc_Paternal_1=Paternal_1/Done_1 * 100
    J'ai essayé d'écrire une fonction pour ensuite l'appliquer à la fonction apply mais je ne sais pas comment gérer les sorties... Jai essayé comme cela, mais ça ne me donne aucune sortie...



    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
    19
    20
    21
    22
    23
    24
    25
     
     
    DeNovoPourcentage=function(x){
     
    DeNovo_1=sum(tab$Variant_Type=="SNV" & x=="DeNovo")
    Uncertain_1=sum(tab$Variant_Type=="SNV" x=="Uncertain")
    Absent_1=sum(tab$Variant_Type=="SNV" & x=="Absent") 
    Maternal_1=sum(tab$Variant_Type=="SNV" x=="Maternal_Inheritance")
    Paternal_1=sum(tab$Variant_Type=="SNV" & x=="Paternal_Inheritance") 
     
    DeNovo_1
    Absent_1
    Uncertain_1
    Maternal_1
    Paternal_1
     
    Done_1= DeNovo_1 + Absent_1 + Uncertain_1 + Maternal_1 + Paternal_1
     
    pourc_DeNovo_1=DeNovo_1/Done_1 * 100
    pourc_Uncertain_1=Uncertain_1/Done_1 * 100
    pourc_Absent_1=Absent_1/Done_1 * 100
    pourc_Maternal_1=Maternal_1/Done_1 * 100
    pourc_Paternal_1=Paternal_1/Done_1 * 100
     
    }

    [/CODE]
    J'aimerai ensuite créer un tableau résumé en fonction des % des différentes colonnes, mais comme je ne sais pas gérer les sorties avec les fonctions, j'aimerai recevoir quelques pistes.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     DeNovo  Uncertain    Absent Paternal_Inheritance Maternal_Inheritance Nombre
    Verif1   76.81564  5.3072626 17.877095            0.0000000             0.000000    716
    Verif2   77.45098  0.0000000 22.549020            0.0000000             0.000000    102
    Verif3   90.00000  0.0000000  0.000000            0.0000000            10.000000     20
    Verif4   89.70588  0.7352941  7.352941            0.0000000             2.205882     136
    Verif5   21.84874 12.6050420 65.546218            0.0000000             0.000000    119
     
    >
    Merci d'avance,

    Aline Vitrac

  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 Aline.

    Je pense que pour votre problème la solution la plus simple serait de réorganiser vos données, de leur forme actuelle vers une forme en "listing" plus en longueur. La fonction melt de {reshape2} par exemple (ou pivot_longer dans {tidyr}) permet de faire simplement cette opération. Après réorganisation, une fonction table fera le tableau croisé et une fonction prop.table vous restituera les pourcentages lignes que vous souhaitez obtenir.

    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
    19
    20
    21
    22
    23
    24
    library(tibble)   # pour saisir les données
    library(reshape2) # transposition/réorganisation des données (melt)
     
    # jeu d'essai
    tab <- tribble(
    ~verification1, ~verification2,~verification3, ~verification4, ~verification5,
    NA,       NA, NA,                     NA, "Absent",
    NA,       NA, "DeNovo",               NA, "DeNovo",
    NA,       NA, NA,                     NA, "DeNovo",
    NA,       NA, NA,                     NA, "Absent",
    NA,       NA, "Paternal_Inheritance", NA, "DeNovo",
    "DeNovo", NA, "DeNovo",               NA, "DeNovo"
    )
     
    # mise des données "à la verticale"
    tab2 <- melt(tab,
                 measure.vars = colnames(tab),
                 variable.name = "verif",
                 value.name = "valeur")
     
    # calcul des pourcentages lignes du tableau verif x valeur
    tab3 <- prop.table(table(tab2$verif,
                             tab2$valeur),
                       1)*100
    Cette solution a le mérite de ne pas devoir énumérer toutes les valeurs possibles du tableau initial, ce qui rend le code plus durable dans le temps.

    Par ailleurs, si lors de vos tests votre fonction n'a rien renvoyé, c'est qu'on ne fait qu'y créer des objets sans indiquer ce qu'on renvoie. La fonction return permet de clarifier ce point ; attention, une fonction ne peut renvoyer qu'un seul objet, il faut donc ajouter une structure globale (vecteur, liste, data.frame) si vous souhaitez renvoyer plusieurs informations.
    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,

    De nouveau merci, beaucoup, cela fait exactement ce que je veux.
    Je vais essayer d'appliquer cela à d'autre type d'opération que je souhaitais faire.
    Il faut que je m'entraine avec les fonctions pour la notion de return car effectivement souvent j'ai beaucoup de choses que je veux sortir mais en tout cas, pour cet exemple votre méthode est simple et efficace.

    Merci beaucoup,

    Aline

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [WD24] Requête avec des calculs sur plusieurs fichiers de données
    Par Gregus dans le forum WinDev
    Réponses: 22
    Dernier message: 07/07/2020, 20h05
  2. Faire des requêtes sur plusieurs bases de données
    Par nandy.c dans le forum Outils de restitution et d'analyse
    Réponses: 15
    Dernier message: 13/06/2013, 18h25
  3. Appliquer une action sur plusieurs objets en même temps
    Par Aminerman dans le forum ActionScript 3
    Réponses: 2
    Dernier message: 27/10/2011, 16h00
  4. Réponses: 2
    Dernier message: 07/06/2011, 15h35
  5. triggers sur plusieurs bases de données
    Par Shabata dans le forum Langage SQL
    Réponses: 2
    Dernier message: 04/05/2004, 10h02

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