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 :

comment remplacer automatiquement certaines valeurs d'un dataframe?


Sujet :

R

  1. #1
    Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Janvier 2017
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2017
    Messages : 5
    Points : 2
    Points
    2
    Par défaut comment remplacer automatiquement certaines valeurs d'un dataframe?
    Bonjour,

    je suis débutante en R et n'ai aucune base d'algorithmique. Du coup je galère un peu sur quelques tâches de base.

    J'aimerais remplacer automatiquement certaines valeurs d'un dataframe en appliquant une condition.

    J'y suis arrivée avec un vecteur (que j'ai nommé "vec") pour lequel je remplace toutes les valeurs > 2 par 100:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    for (i in 1:length(vec))
     
    {if (vec[i] > 2)
    {ft[i]=100} else {ft[i]=vec[i]} }
    Par contre, je bloque pour passer aux dimensions du dataframe. Disons que comme j'ai des tableaux avec plusieurs colonnes, au lieu de transformer chacune des colonnes en vecteur pour leur appliquer cette boucle, j'aimerais le faire sur mon tableau directement.

    J'ai bien lu les aides, je comprends ce que je lis mais j'ai du mal à le formuler.

    Si qqn peut me donner un petit coup de pouce ce me serait d'une grande d'aide.

    Avec mes meilleurs voeux pour 2017.

  2. #2
    Membre habitué
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Septembre 2011
    Messages
    112
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2011
    Messages : 112
    Points : 191
    Points
    191
    Par défaut
    Bonjour et meilleurs voeux !

    voici un code qui fait l'affaire basé sur l'exemple iris :
    Il peut être utilisé tel quel en remplaçant iris par un autre objet data.frame

    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
     
    #Copie des données source
    df<-iris[,1:4] #retrait des données non numériques (la colonne "species"), on peut par exemple écrire aussi iris[,c(1,2,4)] pour exclure les colonnes 3 et 5
     
    head(df)
    cpt=0
    #boucle sur les colonnes
    for (j in 1:ncol(df)){
      #Definition du seuil d'élimination (ici le quantile 95% de la colonne)
      seuil <-quantile(df[,j],0.95)
      print(paste("Colonne", j))
      print(paste("Seuil",seuil))
      #boucle sur les lignes    
      for (i in 1:nrow(df)){
         if(df[i,j]>seuil)
         {
           df[i,j]=NA #modification des valeurs (ici élimination pure et simple) 
           cpt = cpt+1
         }
      }
    }
    print(paste("Nombre de valeurs retirées :",cpt))

  3. #3
    Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Janvier 2017
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2017
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    Bonjour,

    merci beaucoup pour votre réponse,

    l'approche est bien plus claire maintenant.

    Seulement j'ai encore un peu de mal à arriver à mes fins puisque je n'obtiens pas le bon resultat.

    Mon but est de créer un nouveau data frame ("new") à partir d'un data frame de base ("ref").

    Pour cela je crée mon data frame "new" rempli de 0 et de mêmes dimensions que mon premier data frame mais la "formule magique" pour remplacer mes 0 par les Valeurs souhaitée n'est pas encore au point.

    Avec un vecteur j'y arrivais pourtant.

    J'ai écris:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
     
    ref <- dat[,2:4]
     
    ref <- na.omit(df)
     
    new <- data.frame(matrix(0,nrow(ref),ncol(ref)))
     
    for (i in nrow(ref)){
     
    if (ref[i,j] > 2)  {new[i,j]=1} else if (ref[i,j] < -2) {new[i,j]=2}
     else  
        {new[i,j]=3} }
    Pour des raisons que j'ai encore du mal à cerner, "New" reste rempli de 0, les valeurs ne se modifient pas.

    Je dois certainement mal lui attribuer les nouvelles valeurs et j'aimerais le faire pour chaque colonne de différents data frames avec des dimensions variables.

    Qu'est-ce qui cloche dans cette fonction? Que dois-je faire pour remplacer mes 0 par des 1, 2 et 3 selon les valeurs de mon data.frame (ref)?

    Merci d'avance pour le soutien.

  4. #4
    Membre habitué
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Septembre 2011
    Messages
    112
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2011
    Messages : 112
    Points : 191
    Points
    191
    Par défaut
    Bonjour,

    à priori il manque la boucle sur j.


    Mais en fait il y a bien plus simple dans ce cas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    #Remplacement des valeurs >2
    new<-replace(ref,ref>2,1)
    #remplacement des valeurs <-2
    new<-replace(new,new<-2,2)
    #remplacement de toutes les autres valeurs
    new<-replace(new,new!=1&new!=2,3)
    (Pas besoin de créer un data frame emplit de 0)

  5. #5
    Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Janvier 2017
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2017
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    Bonjour,

    désolée pour cette réponse tardive, mais je travaille au compte-goutte sur R, d'où ma progression si lente (il faut bien se trouver une excuse :-)).

    En tout cas merci beaucoup. C'est vrai que je n'avais pas pensé à regardé s'il existait des fonctions de remplacement toutes simples, je n'ai pas encore le réflexe, mais c'est tellement plus simple, merci!
    À noter pour la prochaine plutôt que de chercher compliqué.

    Toutefois, il me reste une limite, et intuitivement jai encore envie d'utiliser un "for", même si ne sait pas trop comment m'y prendre.

    J'aimerais maintenant appliquer la fonction "stri_count_regex" à chaque colonne de mon data.frame "new" (fonction qui m'a été conseillée pour compter le nombre de succession des valeurs 1,2,3 ou 1,3 et qui marche très bien). J'aimerais donc faire une boucle (ou trouver la fonction adéquate) pour compter chaque succession des valeurs 1,2,3 (ou 1,3) dans chaque colonne de "new" et donc obtenir un nouveau data.frame de 1 ligne remplie de la comptabilisation de la succession de ces valeurs pour chaque colonne de "new".

    Je crée donc un data.frame vide (ici appelé "cyc") de 1 ligne et du même nombre de colonnes que new :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cyc <- data.frame(matrix(0,1,ncol(ft)))
    Mais après je bloque toujours sur la même chose et qui est: comment lui demander d'effectuer la fonction "stri_count_regex" sur chaque colonne ? J'y arrive très bien en le faisant sur une seule colonne (et donc sans créer de data.frame vide):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    > cyc <- stri_count_regex(new[1], "1+(2+)?3+|1+3")
    > cyc
    [1] 117
    Mais dès qu'il faut automatiser.... je bloque sur la solution. Le code suivant ne me donne pas d'erreur mais ne me retourne pas ce que je cherche;

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    for (j in ncol(new)){
      cyc <- stri_count_regex(new[,j], "1+(2+)?3+|1+3")
      }
    > cyc
       [1] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0
      [59] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 1 0 1 0 0 0 0 0 0 0
     [117] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0
     [175] 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
     [233] 0 0 1 0 0 0 0 0 0 0 0
    Alors qu'il devrait me retourner qqch comme:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    [1] 117
    [2] 98
    [3]70
    Le code suivant est pire:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    > for (j in ncol(new)){
    +   cyc[,j] <- stri_count_regex(new[,j], "1+(2+)?3+|1+3")
    +   }
     Error in `[<-.data.frame`(`*tmp*`, , j, value = c(0L, 0L, 0L, 0L, 0L,  : 
      replacement has 2214 rows, data has 1
    Je ne comprends pas l'erreur, mais je pense que la subtilité vient du fait que stri_count_regex fonctionne sur des vecteurs ou listes alors que j'ai un data.frame, mais j'ai aussi le sentiment qu'il y a un moyen de légèrement modifier le code pour qu'il me retourne ce que je cherche, et qu'un expert pourrait détecter sans trop de difficultés.

    Une fois de plus j'en appelle à votre précieuse aide.
    Merci beaucoup!

  6. #6
    Membre habitué
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Septembre 2011
    Messages
    112
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2011
    Messages : 112
    Points : 191
    Points
    191
    Par défaut
    Bonjour,

    La fonction stri_count_regex est supposée s'appliquer à un vecteur d'éléments de type string, et s'applique sur chaque élément.
    Du coup il faut d'abord concaténer chaque colonne pour toutes les valeurs dans une chaîne de texte pour pouvoir appliquer la fonction.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
     
    mystring=stri_c(stri_c_list(new))
    cyc=stri_count_regex(mystring, "1+(2+)?3+|1+3")

  7. #7
    Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Janvier 2017
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2017
    Messages : 5
    Points : 2
    Points
    2
    Par défaut pb avec fonction replace
    Bonjour,

    voilà qui est dit avec des mots plus simples et qui m'éclaircit.

    Cela m'a été d'une grande aide!

    Merci beaucoup.

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

Discussions similaires

  1. [Débutant] Extraire certaines valeurs d'un vecteur
    Par Jean Val dans le forum Signal
    Réponses: 2
    Dernier message: 25/03/2015, 19h31
  2. [AC-2007] Remplacer automatiquement des valeurs d'une table volumineuse
    Par ahoure dans le forum VBA Access
    Réponses: 1
    Dernier message: 25/10/2013, 23h27
  3. Remplacement automatique de valeurs
    Par Pedrozito dans le forum MATLAB
    Réponses: 23
    Dernier message: 05/05/2008, 16h35
  4. comment remplacer automatiquement le passage à la ligne classique par <br>
    Par tonelli dans le forum Balisage (X)HTML et validation W3C
    Réponses: 9
    Dernier message: 18/09/2007, 00h07

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