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 :

Tri et opération des données selon la valeur dans une colonne


Sujet :

R

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Consultant MOA
    Inscrit en
    Avril 2018
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Consultant MOA
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2018
    Messages : 12
    Par défaut Tri et opération des données selon la valeur dans une colonne
    Hello tout le monde !

    Je débute l'apprentissage de R aujourd'hui tout juste dans le cadre d'un projet ou j'ai besoin de traiter d'énormes tableau de données.
    Ces tableaux sont des extractions et sont pour la plupart constitués de la même manières:
    - une colonne qui contient la date et l'heure de la mesure (toutes les heures sur un an)
    - une colonne pour chaque client extrait (335)

    J'importe un fichier .csv en tant que data frame dans l'environnement R sans soucis.
    Une des premières étapes de mon programme serait de demander à l'utilisateur les dates et plages horaires pour lesquelles ils veut les valeurs pour pouvoir trier selon la date souhaitée et selon la plage horaire souhaitée.
    J'essaie de faire des subset sur la Date mais je n'arrive à rien.
    Ex : les deux premiers jours de janvier entre 15:30 et 18:30

    Date Client1 Client2 ...
    01/01/2016 16:00 what what ...
    01/01/2016 17:00 I I ...
    01/01/2016 18:00 Want Want ...
    02/01/2016 16:00 what what ...
    02/01/2016 17:00 I I ...
    02/01/2016 18:00 Want Want ...


    Le but étant de faire des opérations du type max, min et moyenne sur la plage horaire de chaque jour et avoir 3 matrice ou dataframe.

    Date Client1 Client2 ...
    01/01/2016 maxofthe period maxofthe period ...
    02/01/2016 maxofthe period maxofthe period ...

    Date Client1 Client2 ...
    01/01/2016 minoftheperiod minoftheperiod ...
    02/01/2016 minoftheperiod minoftheperiod ...

    Date Client1 Client2 ...
    01/01/2016 avgoftheperiod avgoftheperiod ...
    02/01/2016 avgoftheperiod avgoftheperiod ...

    Si vous avez ne serait-ce que des pistes de réponses j'en serait très reconnaissant !

    Merci d'avance !

  2. #2
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2017
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2017
    Messages : 34
    Par défaut
    Bonjour Wenchetan,

    Pour la première demande sur les deux premiers jour du mois de janvier, je ferais un filtre sur la période à partir de la fonction which qui te permet de sélectionner des données selon un critère. Je ne suis pas encore un expert, mais un truc du genre:

    Premier filtre sur les mois:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    library(lubridate) # pour la fonction month
    df_1 = df[which(month(df$date)==1),]
    Explication du code:
    tu vas créer un nouveau dataframe nommé "df_1" qui reprendra les données de "df".
    Lorsque tu ouvres les crochets, tu vas agir sur les lignes (avant la virgule), ou sur les colonnes (après la virgule).
    Tu veux uniquement les valeurs du mois de janvier, donc mois=1, la fonction which te permet de filtrer. Donc ici tu filtres sur ta variable date tous les mois de janvier.

    Tu procèdes à la même chose pour les jours etc...

    Dans un second temps, une fois que tu as ta base clean, tu veux faire le min/max/moyenne sur chaque jour, chaque mois etc. Je passerai par la fonction aggregate.

    Prog_R

  3. #3
    Membre averti
    Homme Profil pro
    Consultant MOA
    Inscrit en
    Avril 2018
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Consultant MOA
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2018
    Messages : 12
    Par défaut
    Plop !

    Merci beaucoup pour ta réponse Prog_R, ça marche exactement comme je le voulais !

    Pour l'aggregation des données sous forme de moyenne par journée, cela reste un peu flou

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    HPMoy <- aggregate(histo_Pu, day(date) , mean)
    il me renvoie que l'argument 'by' (le deuxième) doit être une liste

    J'essaie de créer une liste contenant les jours et les mois pour pouvoir aggréger ensuite :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Jours <- day(strptime(histo_Pu$Date, format = "%d/%m/%Y %H:%M"))
    Mois <- month(strptime(histo_Pu$Date, format = "%d/%m/%Y %H:%M"))
    Liste <- list(Jours, Mois)
     
    HPMoy <- aggregate(histo_Pu, Liste, mean)
    Cependant il me renvoie :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    50: In mean.default(X[[i]], ...) :
      argument is not numeric or logical: returning NA
    J'ai autant de warnings que de jours et j'ai l'impression que cette erreur vient du fait que je ne peut pas aggréger des dates, ce qui est logique.

    Si c'est bien cette erreur, comment pourrais-je aggréger tout le tableau sans le faire sur les dates ?

    J'avais penser à mettre éventuellement les dates en index mais je n'ai aucune idée de comment procéder ...

    Merci d'avance !!

  4. #4
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2017
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2017
    Messages : 34
    Par défaut
    Ce que tu peux faire à partir de ta base:

    tu ajoutes trois colonnes:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    library(lubridate)
     
    df$jours = day(df$date)
    df$mois = month(df$date)
    df$annee = year(df$annee)
    je pense que c'est plus simple comme ça.
    Pour la fonction aggregate, elle fonctionne comme ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    df = data.frame(mois=c(1,5,7,3,1,4,2,4,4),var_2=c(1,2,3,4,5,6,7,8,9))
     
     
    df_agg = aggregate(data.frame(var_2=df$var_2),
                              list(mois=df$mois),
                              sum)
    Explication: trois partie dans la fonction aggregate, une première partie ou tu ajoutes la/les variables sur lesquelles sur aura ton critère (sum, min, max...), une seconde partie ou tu mets la liste, ici tu veux par mois donc tu mets uniquement le mois, et une troisième avec l'opérateur.

    je l'utilise de cette manière mais je pense avoir vu une façon plus optimal ici:

    https://www.developpez.net/forums/d1...s-differentes/


    Prog_R

  5. #5
    Membre averti
    Homme Profil pro
    Consultant MOA
    Inscrit en
    Avril 2018
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Consultant MOA
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2018
    Messages : 12
    Par défaut
    Merci beaucoup prog_R !
    Grace à tes explications j'ai réussi à aggréger,
    Il suffisait d'aggréger sur toutes les variables sauf la date en faisant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    aggregate(df[,2:fin], List, mean)
    Je vais continuer à bosser et j'espère pouvoir t'aider à mon tour un jour !
    Encore merci ! :-)

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

Discussions similaires

  1. [XL-2013] Filtrage des données selon un choix dans une liste déroulante
    Par mo56go dans le forum Excel
    Réponses: 3
    Dernier message: 03/10/2017, 17h04
  2. Regrouper des données selon les valeurs d'un champ
    Par ecarbill dans le forum Requêtes
    Réponses: 1
    Dernier message: 01/06/2015, 07h30
  3. Réponses: 1
    Dernier message: 23/03/2013, 08h51
  4. Réponses: 4
    Dernier message: 21/07/2011, 15h25
  5. {VBA Excel} Colorier des cases selon la valeur dans une autre
    Par Thomas69 dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 27/06/2008, 09h56

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