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 les NA par la somme des valeurs précédentes ?


Sujet :

R

  1. #1
    Membre averti
    Homme Profil pro
    Epitech
    Inscrit en
    Mai 2019
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Epitech

    Informations forums :
    Inscription : Mai 2019
    Messages : 33
    Par défaut Comment remplacer les NA par la somme des valeurs précédentes ?
    Bonjour,

    Pour remplacer les NA j'utilise une boucle while qui me permet de parcourir mon data frame et je calcule au fur et à mesure la somme puis lorsque j'arrive à une valeur égale à NA je place ma somme à la place de NA.
    Cependant dans le cas d'un data frame très grand, cette méthode prendra trop de temps à s'exécuter, c'est pour cela que je voulais savoir s'il existait une fonction ou une autre méthode pour réaliser cela.

    Voici un example de data frame :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    df <- data.frame(c("A", "B", "C", "Total", "A", "Total"), c(1, 2, 3, NA, 7, NA))
    Et le résultat attendu :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    df2 <- data.frame(c("A", "B", "C", "Total", "A", "Total"), c(1, 2, 3, 6, 7, 7))
    Cordialement,

    Arkning

  2. #2
    Membre émérite
    Homme Profil pro
    Inscrit en
    Janvier 2006
    Messages
    491
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Corse (Corse)

    Informations forums :
    Inscription : Janvier 2006
    Messages : 491
    Par défaut
    bonjour, pour tester, je n'ai aucune idée si c'est plus rapide ou non

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    library(tidyverse)
    library(purrr)
    df <- data.frame(a=c("A", "B", "C", "Total", "A", "Total"),b= c(1, 2, 3, NA, 7, NA))
     
    df_na <- rev(which(is.na(df$b)))  
    df_na_dec <-c( df_na[-1],0) 
    df2<-df
    df2[df_na,] <- map2_df(df_na,df_na_dec , ~df %>% slice(.x)  %>% mutate(b = sum(df$b[(.x-1):(.y+1)])))
    cordialement

  3. #3
    Membre averti
    Homme Profil pro
    Epitech
    Inscrit en
    Mai 2019
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Epitech

    Informations forums :
    Inscription : Mai 2019
    Messages : 33
    Par défaut
    Bonjour,

    Merci de votre retour, pourriez-vous m'expliquer un peu plus en détails ce que vous faites, de plus en essayant j'ai eu une erreur au niveau de la fonction slice, je suppose que je dois remplacer .x par quelque chose d'autre ?

    Cordialement,

    Mehdi Salah-eddine

  4. #4
    Membre émérite
    Homme Profil pro
    Inscrit en
    Janvier 2006
    Messages
    491
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Corse (Corse)

    Informations forums :
    Inscription : Janvier 2006
    Messages : 491
    Par défaut
    slice fonction qui filtre sur le numéro de ligne si vous avez un problème vous pouvez remplacer df %>% slice(.x) par df[.x,]
    faites attention la fonction map2_df attend 3 arguments
    les 2 premiers sont des listes de mêmes longueurs , le troisième une fonction ou une formule , dans le script que je vous ai donné j'utilise une formule donc ne pas oublié le tilde ~ ,les paramètres .x et .y correspondent aux éléments des 2 listes

  5. #5
    Membre Expert
    Inscrit en
    Novembre 2009
    Messages
    707
    Détails du profil
    Informations forums :
    Inscription : Novembre 2009
    Messages : 707
    Par défaut Comment remplacer les NA par la somme des valeurs précédentes
    Bonjour,

    Je suis un peu surprise par la structure de votre dataframe. N'avez-vous pas d'identifiant ?

    Dans l'affirmative, vous pouvez faire ainsi :

    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
    > df <- data.frame(Id = c(1,1,1,1,2,2),
    +                  V1 = c("A", "B", "C", "Total", "A", "Total"), 
    +                  V2 = c(1, 2, 3, NA, 7, NA))
    > dfsum <- aggregate(V2 ~ Id, data=df, sum)
    > names(dfsum) <- c("Id", "Sum")
    > df <- merge(df, dfsum, by="Id")
    > df$V2 <- ifelse(is.na(df$V2),df$Sum,df$V2)
    > df <- df[,-length(names(df))]
    > df
      Id    V1 V2
    1  1     A  1
    2  1     B  2
    3  1     C  3
    4  1 Total  6
    5  2     A  7
    6  2 Total  7
    Cordialement,

  6. #6
    Membre averti
    Homme Profil pro
    Epitech
    Inscrit en
    Mai 2019
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Epitech

    Informations forums :
    Inscription : Mai 2019
    Messages : 33
    Par défaut
    Bonjour,

    Merci de votre retour, mon data frame n'est pas un data frame que je crée, je le récupère depuis un fichier excel. Cependant je ne peux pas dévoiler les données pour des raisons de confidentialité donc je vais essayer de généraliser le mieux possible :

    Numéro Numéro 2 Numéro 3 Nom Numéro 4 Divers Numéro 6 Numéro 7 Numéro 8
    XXX XXX XXX A XXX XXX XXX XXX 1
    XXX XXX XXX B XXX XXX XXX XXX 8
    XXX XXX XXX C XXX XXX XXX XXX 9
    XXX XXX XXX D XXX XXX XXX XXX NA
    XXX XXX XXX E XXX XXX XXX XXX 5
    XXX XXX XXX F XXX XXX XXX XXX 6
    XXX XXX XXX G XXX XXX XXX XXX 1
    XXX XXX XXX H XXX XXX XXX XXX NA
    XXX XXX XXX I XXX XXX XXX XXX 3
    XXX XXX XXX J XXX XXX XXX XXX NA
    etc..

    Je veux bien essayer votre méthode cependant comme puis-je assigner le bon "Id" pour appliquer votre méthode ?

    Cordialement,

    Arkning

  7. #7
    Membre averti
    Homme Profil pro
    Epitech
    Inscrit en
    Mai 2019
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Epitech

    Informations forums :
    Inscription : Mai 2019
    Messages : 33
    Par défaut
    Citation Envoyé par xavier-Pierre Voir le message
    slice fonction qui filtre sur le numéro de ligne si vous avez un problème vous pouvez remplacer df %>% slice(.x) par df[.x,]
    faites attention la fonction map2_df attend 3 arguments
    les 2 premiers sont des listes de mêmes longueurs , le troisième une fonction ou une formule , dans le script que je vous ai donné j'utilise une formule donc ne pas oublié le tilde ~ ,les paramètres .x et .y correspondent aux éléments des 2 listes
    Bonjour,

    Merci, j'ai enfin compris à quoi correspondent le .x et le .y, donc en essayant votre méthode sur mon data frame j'obtiens cette erreur :
    Warning message:
    In `[<-.data.frame`(`*tmp*`, df_na, , value = list(`Numero Facture` = c("889C1001419810",  :
      provided 10 variables to replace 9 variables
    Je suppose que la raison est du au fait que vous aviez adapté votre code à mon data frame qui était supposé ne faire que 2 colonnes alors qu'il en fait 9. Mais j'ai du mal à voir ce que je peux modifier dans votre méthode pour que cela marche sur mon data frame.

    Cordialement,

    Arkning

  8. #8
    Membre émérite
    Homme Profil pro
    Inscrit en
    Janvier 2006
    Messages
    491
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Corse (Corse)

    Informations forums :
    Inscription : Janvier 2006
    Messages : 491
    Par défaut
    a priori il suffit de remplacer ma colonne b par le nom de votre colonne

  9. #9
    Membre averti
    Homme Profil pro
    Epitech
    Inscrit en
    Mai 2019
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Epitech

    Informations forums :
    Inscription : Mai 2019
    Messages : 33
    Par défaut
    Citation Envoyé par xavier-Pierre Voir le message
    a priori il suffit de remplacer ma colonne b par le nom de votre colonne
    Bonjour,

    Effectivement, je l'avais remplacé mais j'avais oublié le premier B dans la fonction mutate je viens d'essayer ca marche parfaitement, je vous remercie !

    Cordialement,

    Arkning

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

Discussions similaires

  1. Comment remplacer les espaces par la valeur NULL
    Par ToniConti dans le forum MS SQL Server
    Réponses: 7
    Dernier message: 15/04/2010, 13h41
  2. Comment remplacer les tabulations par des espaces ?
    Par richarno dans le forum Langage
    Réponses: 7
    Dernier message: 25/10/2007, 14h05
  3. [vb6] Remplacer les Frames par des PictureBox
    Par Christophe P. dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 10/07/2006, 17h26
  4. Comment remplacer le clavier par des boutons ?
    Par aliwassem dans le forum Langage
    Réponses: 1
    Dernier message: 14/12/2005, 20h00
  5. Réponses: 2
    Dernier message: 29/11/2005, 15h17

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