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 :

Problème basic - data.frame


Sujet :

R

  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2017
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2017
    Messages : 4
    Par défaut Problème basic - data.frame
    Bonsoir à tous,

    Je tiens tout d'abord à m'excuser si je ne poste pas au bon endroit, je suis actuellement en train de m'arracher les cheveux sur un problème qui je suis sûr est tout simple

    Je dispose d'un .csv comportant plusieurs colonnes (que j'ai bien évidemment chargé en data frame sous R), pour mon étude 2 colonnes m'intéresse, "Date" & "Nom"

    La colonne "Date" comporte des éléments sous le format ci-dessous :
    JJ/MM/AAAA HH:MM:SS soit par exemple 01/02/2016 12:20:30 soit le premier février 2016 à 12h20 min 30s

    A cette ligne est associé sur la colonne suivante "Nom", comportant le nom d'une personne (Ex : Jean ).

    Ce que je voudrais faire, c'est de calculer toutes les heures (pour chaque jour du mois de février), le nombre de personne associées. Je ne sais pas si c'est clair mais je vais faire un exemple pour illustrer mon propos :

    DATE Nom

    01/02/2016 12:20:30 Jean
    01/02/2016 12:40:02 Pierre
    01/02/2016 12:46:00 Sylvain
    01/02/2016 12:55:30 Pierre
    01/02/2016 12:58:07 Jean
    01/02/2016 13:05:30 Nathalie
    01/02/2016 14:20:30 Florence


    Je voudrais du coups que ma fonction m'indique que le 01/02/2016, entre 12h et 13h, il y'a les "scores" suivant : Jean : 2 / Pierre : 2 / Sylvain : 1
    entre 13h et 14 h : Nathalie : 1 etc ... jusqu'au jour suivant.

    Comme vous pouvez le constater le problème semble simple, mais je peux vous assurer que sa simplicité m'a perturbé au point d'en être bloqué..

    Par avance je remercie l'âme charitable que voudra bien prendre un peu de son temps pour aider une personne qui fait ses premières gammes sous R.

    N.B : Est-ce que le fait d'avoir un jeu de donnée de près de 4,5k lignes posera problème pour ma fonction en terme de performance ? (reparcours plusieurs fois le tableau par exemple)

  2. #2
    Membre éclairé
    Homme Profil pro
    Data Scientist
    Inscrit en
    Février 2017
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Data Scientist

    Informations forums :
    Inscription : Février 2017
    Messages : 28
    Par défaut
    Salut !

    J'ai fait un code dont tu peux t'inspirer. Est-ce la réponse à ta question ?

    Code R : 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
    # Génération de la table d'exemple (base)
     
    DATE=c("01/02/2016 12:20:30","01/02/2016 12:40:02","01/02/2016 12:46:00",
        "01/02/2016 12:55:30","01/02/2016 12:58:07","01/02/2016 13:05:30","01/02/2016 14:20:30")
    Nom=c("Jean","Pierre","Sylvain","Pierre","Jean","Nathalie","Florence")
    base=data.frame(DATE,Nom)
     
    #Si il n'y a que les dates et les heures qui t'intéressent,
    #tu peux "couper" ta colonne Date avec la fonction substr()
    base$DATE=substr(base$DATE,start=1,stop=13)
     
     
    # Tu peux maintenant faire un "split" afin d'avoir les individus correspondants à chaque temporalités
    resume=split(base$Nom,base$DATE)
    resume=sapply(resume,function(x) return(factor(x,exclude=NULL)))
     
    #Tu appliques à la liste resume la fonction summary 
    X=sapply(resume,summary)
     
    #Si tu cherches qui est dans une date à une heure précise, par exemple les individus apparus le 01 février 2016 entre 12h et 13h
    X$`01/02/2016 12`

  3. #3
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2017
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2017
    Messages : 4
    Par défaut
    Bonjour,

    Je ne connaissais pas la fonction split et je la trouve très utile pour mon problème, je te remercie !

    Dans ton exemple tu as crée manuellement les deux tables, je vais m'amuser à les charger directement depuis un fichier existant

    Par contre petite remarque, à l'aide de la ligne de commande "X$`01/02/2016 12`" je peux avoir les noms associés à chaque heure, mais étant donnée que j'ai un fichier volumineux (4.5k lignes) , est ce que je ne pourrais pas stocker l'ensemble des résultats dans un nouveau tableau / liste ? (plutôt que de répetez la tâche n fois pour chaque heure de chaque jour).

    Encore une fois je te remercie, tu m'as donnée des pistes qui me seront utile

  4. #4
    Membre éclairé
    Homme Profil pro
    Data Scientist
    Inscrit en
    Février 2017
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Data Scientist

    Informations forums :
    Inscription : Février 2017
    Messages : 28
    Par défaut
    En lançant cette commande, on retire les facteurs qui n'interviennent pas à une période donnée.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    resume=sapply(resume,function(x) return(factor(x,exclude=NULL)))
    Si tu l'enlèves et que tu exécutes les autres commandes. Le tables X générée ressemblera à ça

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    > X=sapply(resume,summary)
    > X
             01/02/2016 12 01/02/2016 13 01/02/2016 14
    Florence             0             0             1
    Jean                 2             0             0
    Nathalie             0             1             0
    Pierre               2             0             0
    Sylvain              1             0             0
    Mais ça peut devenir très très lourd si tu as un énorme fichier. Après ça peut le faire si tu n'as pas beaucoup de personne différentes.

    Dans tous les cas, que tu enlèves ou non la commande présentée au début de ce message. Tes résultats seront stockés dans la variable X.
    Si tu la retires, la table générée ressemblera à ça. Tu peux récupérer les valeurs très facilement

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
      X=sapply(resume,summary)
    > X
    $`01/02/2016 12`
       Jean  Pierre Sylvain 
          2       2       1 
     
    $`01/02/2016 13`
    Nathalie 
           1 
     
    $`01/02/2016 14`
    Florence 
           1

  5. #5
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2017
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2017
    Messages : 4
    Par défaut
    Bonjour,

    Merci pour votre retour j'ai pu appliquer cela à mon ensemble de donnée avec une visualisation un peu plus personnalisée.


    Petite question par rapport à la commande substr, est-ce possible de l'utilisé pour une "coupe" sans nombre de caractère défini ?

    Exemple simple rajouter un délimiteur type slash "/".

    Exemple si dans une de mes colonnes j'ai des données de type :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    /Vache/Lait/Herbe
    /Lion/Viande/Sable
    /Poulet/Graine/Ville
    Serait-il possible à l'aide de la fonction substrde récupérer uniquement le premier mot (ici le nom de l'animal) contenu entre le premier "/" et le second "/" ?

    je continue de chercher si d'autre fonction font ce type de découpage, encore merci pour tes retours

    N.B : J'ai regardé la fonction substrsur le CRAN mais malheureusement je n'ai pas l’impression que cela soit possible.

    N.B² : Avec un essai candide (Dataset$Animal =substr(Dataset$Animal, start = 1, stop = '/") j'ai eu l'erreur NAs introduced by coercion

  6. #6
    Membre éclairé
    Homme Profil pro
    Data Scientist
    Inscrit en
    Février 2017
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Data Scientist

    Informations forums :
    Inscription : Février 2017
    Messages : 28
    Par défaut
    Je ne sais pas si la fonction substr() peut faire ce que tu demandes.

    En revanche tu peux utiliser la fonction strsplit() pour extraire chacun des éléments entre tes / et récupérer le 2ème élément de chaque vecteur avec la fonction sapply()

    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
    > Animaux=c("/Vache/Lait/Herbe","/Lion/Viande/Sable","/Poulet/Graine/Ville")
    > 
    > list_animaux=strsplit(Animaux, "/")
    > list_animaux
    [[1]]
    [1] ""      "Vache" "Lait"  "Herbe"
     
    [[2]]
    [1] ""       "Lion"   "Viande" "Sable" 
     
    [[3]]
    [1] ""       "Poulet" "Graine" "Ville" 
     
    > sapply(list_animaux,"[[",2)
    [1] "Vache"  "Lion"   "Poulet"

  7. #7
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2017
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2017
    Messages : 4
    Par défaut
    Bonjour,

    J'aurais aimer récupérer uniquement le premier mot (le nom de l'animal dans cet exemple) plutôt que la liste entière sans les slashs.

    Anyway je l'ai fait sous excel c'était plus simple, encore merci pour l'aide

  8. #8
    Membre éclairé
    Homme Profil pro
    Data Scientist
    Inscrit en
    Février 2017
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Data Scientist

    Informations forums :
    Inscription : Février 2017
    Messages : 28
    Par défaut
    Citation Envoyé par Artaud Voir le message
    Bonjour,

    J'aurais aimer récupérer uniquement le premier mot (le nom de l'animal dans cet exemple) plutôt que la liste entière sans les slashs.

    Anyway je l'ai fait sous excel c'était plus simple, encore merci pour l'aide
    Ben c'est exactement ce que j'ai fait en fait. La commande en une ligne:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    > Animaux=c("/Vache/Lait/Herbe","/Lion/Viande/Sable","/Poulet/Graine/Ville")
    > sapply(strsplit(Animaux, "/"),"[[",2)
    [1] "Vache"  "Lion"   "Poulet"

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

Discussions similaires

  1. Un problème particulier (data.frame)
    Par Eliam dans le forum R
    Réponses: 8
    Dernier message: 19/05/2015, 11h49
  2. Réponses: 0
    Dernier message: 06/05/2015, 15h27
  3. mean() sur ligne data.frame : problème des levels
    Par AustinPower999 dans le forum R
    Réponses: 0
    Dernier message: 01/04/2013, 22h11
  4. Problèmes données data.frame
    Par vincent1989 dans le forum R
    Réponses: 4
    Dernier message: 15/02/2013, 19h26
  5. Réponses: 3
    Dernier message: 20/09/2011, 10h24

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