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 :

Réaliser subset [Débutant(e)]


Sujet :

R

  1. #1
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Avril 2015
    Messages
    43
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2015
    Messages : 43
    Points : 15
    Points
    15
    Par défaut Réaliser subset
    Bonjour à tous,

    Toujours moi et mes problèmes je reviens en force

    Aujourd'hui le problème du jour est: filtrer des vaches.

    Je cherche à filtrer les données des veaux nés de la première gestation d'une vache.
    Pour cela, je dispose du numéro du veau, du numéro de la vache et de sa date de naissance.

    J'ai imaginé qu'il aurait fallu faire une fonction "subset". Sauf que comment on utilise un subset avec des dates ? (En sachant qu'il faudra du coup prendre le veau qui a la date de naissance la plus "ancienne").

    Parce que si une vache a eu 5 veaux (par exemple) comment je fais pour ne garder que son premier veau ? Et donc faire ça pour chaque vache ? En sachant que je ne peux pas donner une année (du genre tous les veaux nés en 2010) parce qu'il peut y avoir des premiers veaux dans n'importe quelle année entre 2010 et 2015.

    Merci d'avance

  2. #2
    Membre éclairé
    Homme Profil pro
    Ingénieur de recherche
    Inscrit en
    Janvier 2012
    Messages
    325
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur de recherche
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Janvier 2012
    Messages : 325
    Points : 888
    Points
    888
    Par défaut
    Il existe des classes pour gérer les dates, utilise les fonction as.Date ou as.POSIXct (si tu as des heures/minutes/secondes).
    Exemple : as.Date("01/12/13",format="%d/%m/%y")

    Ensuite pour trouver le premier veau, il y a plusieurs façon de faire.
    Avec la fonction by par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    df=data.frame(mere=rep(letters[1:3],3),date=runif(9)) # Création d'un jeu de données bidon, avec un nombre aléatoire à la place des dates mais ça reviens au même
    df
    Reduce(rbind,by(df,df$mere,function(veaux){cbind(veaux,ordre=order(veaux$date))}))

  3. #3
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Avril 2015
    Messages
    43
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2015
    Messages : 43
    Points : 15
    Points
    15
    Par défaut
    La fonction met énormément de temps à se faire (ça fait 2h qu'elle est lancée...) c'est normal ?

  4. #4
    Membre éclairé
    Homme Profil pro
    Ingénieur de recherche
    Inscrit en
    Janvier 2012
    Messages
    325
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur de recherche
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Janvier 2012
    Messages : 325
    Points : 888
    Points
    888
    Par défaut
    Tes données font quelle taille?
    Les fonctions by (ou aggregate) ne sont pas très adaptées aux gros jeux de données (> 100 000 lignes).
    Mais il existe des packages qui permettent d'indexer les colonnes des dataframes et améliorent considérablement les performances.

  5. #5
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Avril 2015
    Messages
    43
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2015
    Messages : 43
    Points : 15
    Points
    15
    Par défaut
    Ah oui moi j'ai environ 200 000 données

    Des infos sur ce package ? A moins que je laisse mon ordi allumé une semaine ?

  6. #6
    Membre éclairé
    Homme Profil pro
    Ingénieur de recherche
    Inscrit en
    Janvier 2012
    Messages
    325
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur de recherche
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Janvier 2012
    Messages : 325
    Points : 888
    Points
    888
    Par défaut
    Avec le package data.table :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    library(data.table)
    df=data.table(mere=rep(1:100000,3),date=runif(300000))
    df2=df[,list(date,ordre=rank(date)),by=mere]
    C'est équivalent au code posté précédement, sauf que pour 300000 lignes ça ne prend que quelques secondes.

    À noter que je m'étais trompé dans mon message précédent, il faut utiliser la fonction rank et non order (je les confond toujours).

  7. #7
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Avril 2015
    Messages
    43
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2015
    Messages : 43
    Points : 15
    Points
    15
    Par défaut
    Merci beaucoup, j'ai installé data.table mais par contre je ne comprends pas qu'est ce que je dois mettre dans la fonction "rep()" et "runif()"

    Parce que là ça me sort un tableau tout chelou où le numéro de la mère n'est plus qu'un chiffre au lieu d'être une succession de 10 chiffres précédés de FR, la date de vêlage est en décimale au lieu d'être en format date et la dernière colonne me met le même chiffre à chaque fois...

    Voici ce que ça me donne en code pour moi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    df=data.table(NumMere=rep(1:204544,8),DateVelage=runif(204544))
    df2=df[,list(DateVelage,ordre=rank(DateVelage)),by=NumMere]
    Pour "rep()" j'ai mis entre 1 et le nombre de lignes du jeu de données, et pour "runif()" j'ai mis le nombre de données.

    Je précise que j'ai bien mis le format "as.Date" pour le facteur DateVelage.

  8. #8
    Membre éclairé
    Homme Profil pro
    Ingénieur de recherche
    Inscrit en
    Janvier 2012
    Messages
    325
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur de recherche
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Janvier 2012
    Messages : 325
    Points : 888
    Points
    888
    Par défaut
    la ligne avec rep et runif c'est juste pour générer un jeu de données bidon sur lequel tester. Évidement toi tu as ton vrai jeu de données donc tu n'en as pas besoin.

  9. #9
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Avril 2015
    Messages
    43
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2015
    Messages : 43
    Points : 15
    Points
    15
    Par défaut
    Ah d'accord!

    Mais du coup quel tête doit avoir ma formule?

    Désolé je suis un peu une assistée de R

  10. #10
    Membre éclairé
    Homme Profil pro
    Ingénieur de recherche
    Inscrit en
    Janvier 2012
    Messages
    325
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur de recherche
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Janvier 2012
    Messages : 325
    Points : 888
    Points
    888
    Par défaut
    Il faut que tu transformes ta data.frame en data.table avec la fonction data.table.

  11. #11
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Avril 2015
    Messages
    43
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2015
    Messages : 43
    Points : 15
    Points
    15
    Par défaut
    Super ça marche ! Merci beaucoup !! Et du coup, comment je fais pour afficher mes 5 autres variables ?

    Par la suite, je pourrais faire un subset à partir de cette fonction ?

  12. #12
    Membre éclairé
    Homme Profil pro
    Ingénieur de recherche
    Inscrit en
    Janvier 2012
    Messages
    325
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur de recherche
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Janvier 2012
    Messages : 325
    Points : 888
    Points
    888
    Par défaut
    Pour avoir les autres colonnes il te suffit de les ajouter dans la liste à côté de DateVelage.

    Une data.table est une data.frame (en jargon de programmation on dit que data.table hérite de data.frame), donc tout ce qui marche sur une data.frame marche sur une data.table, y compris subset.

  13. #13
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Avril 2015
    Messages
    43
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2015
    Messages : 43
    Points : 15
    Points
    15
    Par défaut
    Merci beaucoup c'est vraiment super!!

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

Discussions similaires

  1. msi ou comment réaliser un installeur?
    Par herzleid dans le forum Delphi
    Réponses: 11
    Dernier message: 09/04/2007, 19h27
  2. Réaliser un Chat avec support IP
    Par Sub0 dans le forum Développement
    Réponses: 12
    Dernier message: 14/07/2006, 10h59
  3. Comment réaliser des modèles de documentations avec XML ?
    Par Dams76 dans le forum XML/XSL et SOAP
    Réponses: 6
    Dernier message: 29/08/2003, 02h15
  4. [Radio fréquence] réalisation d'une application
    Par WriteLN dans le forum Développement
    Réponses: 14
    Dernier message: 05/06/2003, 14h36
  5. [imprecis]Réaliser a^n avec seulement l'opérateur d'addition
    Par Amon dans le forum Algorithmes et structures de données
    Réponses: 18
    Dernier message: 08/11/2002, 22h22

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