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 :

Manipulation dans un data.frame


Sujet :

R

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2017
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Juin 2017
    Messages : 6
    Par défaut Manipulation dans un data.frame
    Bonsoir à tous,

    J'ai deux petit soucis sur R, je suis débutant et me prend parfois le chou pour des fonctions simples

    Voici mon premier soucis, je dispose d'un dataframe comportant plusieurs colonnes, je voudrais faire une opération simple sur 2 de ces colonnes : la colonne "Date" et la colonne " Calculate"

    Ci dessous un exemple du tableau :

    Date Calculate
    2017-06-03 12:30:25 128
    2017-06-02 22:30:21 345
    2017-06-01 10:16:36 1060
    2017-06-01 10:15:22 452
    2017-06-01 10:00:12 N/A

    Le champs Date est sous le format "YYYY-MM-DD HH:MM:SS"
    Le champ Calculate contient parfois des champs vide (N/A)

    Je voudrais étudier la distribution de la colonne calculate en fonction du temps (sachant que plusieurs valeur sont disponible pour une même date), avez vous une suggestion pour pouvoir voir cette distribution graphiquement ? J'ai regardé du côté de la library ggplot2 mais je n'ai pas réussi .. (il est à noter que mes dates sont dans l'ordre décroissante ds mon dataset cela impact-il la viz' ?)


    Mon deuxième soucis est que j'aimerais récupérer au sein d'une colonne "message" comportant une chaine de caractère, un caractère particulier et le rajouter dans une autre colonne(NewColumn) que j'aurais crée, la valeur associée.

    Exemple :

    message NewColumn

    [...] (10%)[...] 10
    [...] (8%) [...] 8
    [...](15%) [...] 15


    "[...]" signifie juste une chaîne de caractère quelconque, j'ai crée une regex pour trouver ce qui m'intéresse (un pourcentage compris entre parenthèse), malheureusement je ne sais pas si ça m'est utile dans ce genre de problème.

    Par avance je vous remercie

  2. #2
    Membre émérite
    Homme Profil pro
    Chercheur
    Inscrit en
    Décembre 2015
    Messages
    327
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2015
    Messages : 327
    Par défaut
    1) Je ne vois pas à quoi sert le regex. La colonne Date a un format standard de date qui peut être manipulée comme des objets de la classe Date de R.
    2)
    Je voudrais étudier la distribution de la colonne calculate en fonction du temps (sachant que plusieurs valeur sont disponible pour une même date)
    Ce n'est pas très clair. Une distribution est construite sur le recensement du nombre d'occurrences de chaque valeur (ici de calculate ?). Est-ce dire que ce que tu cherches est un histogramme qui recense pour une date donnée, l'évolution du nombre d'occurrences ?
    3) Le % se réfère à quoi ?

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2017
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Juin 2017
    Messages : 6
    Par défaut
    1- Concernant la regex elle n'a d'intérêt que pour mon second soucis (extraire la valeur en pourcentage), je comptais faire une fonction simple du type (if regex == 1 ) { fonction ...

    2- La profondeur de mes données (de date) est de 6mois, j'étais habitué à faire des histogrammes "à la mano" en mettant une date par labels, mais là étant donnée le nombre de jour je ne peux pas partir sur cette solution.
    Idéalement j'aimerais sommer les valeurs de calculate par mois, et analyser la distrubution, mais je ne vois pas comment faire y'a t-il une librairie permettant de faire ce genre d'opération ? j'ai regardé du côté de "lubridate" ..

    3- Le % se réfère à un message de consommation de CPU (je reçois des alertes automatiques)

  4. #4
    Membre émérite
    Homme Profil pro
    Chercheur
    Inscrit en
    Décembre 2015
    Messages
    327
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2015
    Messages : 327
    Par défaut
    Si la colonne date contient des données de la classe Date de R, ce qui semble être, alors il existe des fonctions permettant d'extraire des sous champs comme le mois. 'lubridate' que je ne connait pas semble être une extension de ces fonctions.
    Ensuite, si je comprend bien, il s'agit pour chaque mois, de calculer l'histogramme des valeurs. La fonction hist (avec plot=FALSE) le permet.
    Si j'ai alors compris le problème, une fonction de type aggregate y répond :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    dq <- data.frame( date=sample( letters[1:3], size=30000, replace=TRUE), calculate=sample( 1:10, size=30000, replace=TRUE))
    res <- aggregate( calculate ~ date, dq, hist, plot=FALSE, simplify=FALSE)
    res est alors un data.frame dont la première colonne (ici date) contient les valeurs de regroupement et la seconde, des histogrammes de la classe histogram, avec pour chaque ligne, la valeur de 'date' étant la date et en regard, l'histogramme.

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2017
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Juin 2017
    Messages : 6
    Par défaut
    Bonjour,

    Merci pour votre retour.
    Je viens de résoudre mon premier soucis (étude de la distribution).

    En revanche je bloque toujours sur mon second, pour extraire une chaine de caractère d'une phrase.

    Je ré-explique mon soucis, j'ai une colonne contenant des tickets, exemple :

    "L'usage est en dessous de (45%), il faudrait y remedier"
    "La barre des (30%) a été atteinte"
    "Error 404 (25%) "


    Je voudrais créer une fonction qui m'extrait la valeur en pourcentage , cad 45 /30/25, et me les mettent dans une nouvelle colonne. Il me semble que le seul moyen pour y arriver et l'utilisation d'une regex, mais visiblement faubry n'est pas du même avis. Pouvez vous m'éclairer là dessus ?

    Par avance, merci

  6. #6
    Membre émérite
    Homme Profil pro
    Chercheur
    Inscrit en
    Décembre 2015
    Messages
    327
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2015
    Messages : 327
    Par défaut
    La demande est assez peu claire et il y manque notamment une explication sur l'origine des données et leur structure, ainsi que le code utilisé. Soit les message résulte d'un traitement des données initiales, ce qui m'a semblé à la lecture de la demande et le traitement se fait directement sur le résultat des histogramme, soit le message appartient aux données initiales ce qui finalement semble être le cas.

    S'il n'y a qu'une seule chaîne de caractères entre parenthèse, on peut utiliser deux regex avec l'argument fixed=TRUE, lr premier pour chercher la position de la parenthèse ouvrante et le second, la parenthèse fermante.

  7. #7
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2017
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Juin 2017
    Messages : 6
    Par défaut
    je dispose d'un data frame, l'origine des données n'est donc pas importante étant donnée que je travail uniquement sur ce data frame.

    Dans ce data frame je dispose d'une colonne "Message", contenant un message d'erreur.

    Pour bien expliquer mon problème je vais le faire sur une ligne (avec un exemple tiré de mon chapeau) :


    Message

    j'ai 10% de chance de récupérer la valeur 18, idéalement j'aimerai en avoir (15%)


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    class(MaTable$Message)
    [1] "factor"
    Dans cette chaîne de caractère, j'aimerai extraire la valeur contenu entre les parenthèses suivi du signe "%", comme vous pouvez le voir j'ai volontairement rajouter un 10% en début de phrase pour montrer que je veux uniquement la valeur numérique comprise entre parenthèse.

    Idéalement j'aimerais donc avoir une fonction qui me permet, dans une nouvelle colonne, d'avoir la valeur 15, avez vous des pistes ?

  8. #8
    Membre émérite
    Homme Profil pro
    Chercheur
    Inscrit en
    Décembre 2015
    Messages
    327
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2015
    Messages : 327
    Par défaut
    Merci, c'est plus clair.
    1) Il faut mieux transformer la colonne 'Message' en chaines de caractères :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MaTable$Message <- as.character( MaTable$Message)
    2) Utiliser la fonction str_extract du package stringr :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    require( stringr)
    st <- "j'ai 10% de chance de récupérer la valeur 18, idéalement j'aimerai en avoir  (15%)"
    res <- gsub( "\\(|%|\\)", "", str_extract( st, "\\([0-9]*\\)"))
    Voir http://gastonsanchez.com/Handling_and_Processing_Strings_in_R.pdf pour une présentation en français de ces fonctions.

  9. #9
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2017
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Juin 2017
    Messages : 6
    Par défaut
    Bonjour

    Merci pour votre retour, je viens de tester votre code, et malheureusement ça me stock N/A à la valeur res ..

Discussions similaires

  1. Match 'date&temps' dans 2 data.frames différents
    Par arnaud.lucas dans le forum R
    Réponses: 0
    Dernier message: 24/10/2011, 15h04
  2. Rajout d'une colonne dans une data frame
    Par kalapiso dans le forum R
    Réponses: 2
    Dernier message: 23/10/2011, 14h43
  3. Suppression de colonnes dans un data.frame
    Par ricoben dans le forum R
    Réponses: 1
    Dernier message: 13/04/2010, 17h13
  4. Mean par colonne dans une data frame
    Par manoir dans le forum R
    Réponses: 3
    Dernier message: 19/06/2009, 11h06
  5. Réponses: 2
    Dernier message: 14/11/2008, 14h53

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