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 :

Extraction d'une partie d'un tableau (sélection de certaines lignes selon critère)


Sujet :

R

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2012
    Messages
    69
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2012
    Messages : 69
    Par défaut Extraction d'une partie d'un tableau (sélection de certaines lignes selon critère)
    Bonjour,
    Je dispose d'un jeu de données de températures avec pour chaque ligne :
    _ la date
    _ le numéro du jour de l'année (1 à 365)
    _ l'heure
    _ une valeur de tension
    _ puis 20 valeurs de températures (que l'on peut assimiler à 20 capteurs de température différents).
    Le dispositif relève des valeurs de températures toutes les 10min, jour et nuit.

    Je souhaite maintenant dissocier les données acquises le jour de celles acquises la nuit. Pour cela, j'ai récupéré les horaires de lever/coucher du soleil afin de sélectionner dans mon fichier de données les valeurs acquises dans la fourchette horaire correspondant au "jour".

    Je souhaiterais donc écrire un script permettant de récupérer, pour chaque jour :
    _ à partir d'un premier fichier .txt, les horaires de lever/coucher du soleil
    _ pour sélectionner, dans un second fichier .txt, les lignes de données se situant dans cette fourchette horaire, ici aussi pour chaque jour.

    Je pense que je suis obligé d'avoir recours à une boucle ici, la vectorisation me semble impossible du fait de ma condition horaire.

    L'idéal serait d'aboutir à 1 fichier contenant les données acquises la nuit et un autre les données acquises le jour.

    Merci d'avance pour votre aide!

  2. #2
    Membre chevronné
    Homme Profil pro
    MCU
    Inscrit en
    Juillet 2010
    Messages
    185
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : MCU
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2010
    Messages : 185
    Par défaut
    Bonjour,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    ?read.table
    ?reshape
    ?merge
    ?which
    ?as.Date
    ?strptime
    EDIT : pas besoin de boucle for a priori...

    Bon courage

    Vincent

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2012
    Messages
    69
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2012
    Messages : 69
    Par défaut
    Voici le script que j'avais commencé à écrire :

    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
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    donnees=read.table("Gotheron.txt",header=TRUE)
    #fichier txt avec les données de température
    soleil=read.table("HSSaint Epain.txt",header=TRUE)
    #fichier txt avec les horaires de lever/coucher du soleil.
    #les deux fichiers sont dispo en pièce jointe
     
    x=donnees$date2[1];
    #j'identifie le jour auquel mon fichier de données commence, à la première ligne.
    daydata=data.frame(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0)
    #je crée un nouveau tableau dans lequel je rentrerai les lignes de données qui m'intéressent.
     
    for (i in 1:nrow(soleil)){
      hl=soleil$lever[i];
      hc=soleil$coucher[i];
    #a chaque du fichier des horaires de lever/coucher du soleil, je rentre l'heure de lever dans la variable "hl" et l'heure de coucher dans la variable hc.
      for (j in 1:nrow(donnees)){
    #maintenant dans mon fichier de données..
        while (donnees$date2[j]==x){
    #tant que la date est la mm que celle pour laquelle j'ai précédemment relevé l'heure de lever/coucher du soleil..
          if (donnees$heure[j]>hl & donnees$heure[j]<hc){
    #si l'heure à laquelle cette ligne de données a été crée se situe entre l'heure de lever et coucher du soleil...
            dayline=as.vector(donnees[,j], mode="numeric")
    #alors on retient cette ligne...
            daydata=rbind(jour,dayline)
    #et on la rajoute dans le tableau "daydata".
            x=x+1;
          }
        }
      }
    }
     
    write.table(jour,file="DayData.txt",row.names=FALSE,col.names=FALSE,sep=" ")

    Voila, j'ai fait ce script. Seulement, chaque fichier de données fait environ 15 000 lignes et le script n'en finit pas de tourner... je devrais donc fonctionner en vecteurs et faire en sorte de retirer les boucles qui font ramer la machine. Auriez-vous pour cela des pistes à suivre? merci!

    PS: en pièce jointe les fichiers txt ouverts au début du script!
    Fichiers attachés Fichiers attachés

  4. #4
    Membre chevronné
    Homme Profil pro
    MCU
    Inscrit en
    Juillet 2010
    Messages
    185
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : MCU
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2010
    Messages : 185
    Par défaut
    Bonsoir,

    Deux remarques :
    1. Les espaces dans les noms de fichiers, çaylemal
    2. Entre vos deux fichiers, date1 et date2 ne correspondent pas. Je me pemets d'enlever date2 dans HSSaint_Epain.txt


    Après, mes excuses, j'ai oublié :
    Ce qui nous donne

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    temp <- read.table("Gotheron.txt", header=TRUE, sep="\t", stringsAsFactors=FALSE)
    jours <- read.table("HSSaint_Epain.txt", header=TRUE, sep="\t", stringsAsFactors=FALSE)
    jours <- jours[, -2] ## mieux vaut utiliser les noms des variables...
    test <- merge(jours, temp)
    test$jour <- ifelse(test$heure >= test$lever & test$heure < test$coucher, TRUE, FALSE)
    test.jour <- test[which(test$jour), ]
    test.nuit <- test[which(!test$jour), ]
    HTH

    Vincent

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2012
    Messages
    69
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2012
    Messages : 69
    Par défaut
    Ok pour l'espace, ça ne semblait pas poser problème mais pas besoin de se créer des problèmes supplémentaires en effet!

    Autrement, pour les histoires de date1 et date2 :
    _ date2 est l'équivalent de date1 mais exprimée en nombre de jours dans l'année. Je suis parti du principe que ce serait plus simple à utiliser dans le script qu'une date au format jj/mm/aaaa.
    _ Il n'y a pas de différences entre les deux fichiers. Seulement, chacun ne commence pas à la même date. Comme expliqué dans le script, je souhaiterais donc relever dans le fichier de données la date à laquelle l'échantillonnage des températures a commencée pour démarrer à cette date dans le fichier d'horaire de lever/coucher du soleil. En d'autres termes, pour utiliser comme premières valeurs de lever/coucher du soleil les valeurs qui correspondent à cette date et incrémenter ensuite d'un jour à chaque fois que je passe à une autre journée dans le fichier de données de températures. Pas forcément évident à expliquer :p

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2012
    Messages
    69
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2012
    Messages : 69
    Par défaut
    ça semble très bien fonctionner!

    du mal avec les vecteurs bizarrement, alors que ce n'est pas plus compliqué que les boucles mais je ne sais pas, moins intuitif peut-être.

    2 petites questions :
    1) merge regroupe les deux tableaux de données en utilisant par défaut la colonne commune, ici date1 c'est bien cela? Même si les deux tableaux ne comportent pas le même nombre de lignes. On peut d'ailleurs voir que la fonction merge comble les lignes manquantes en répétant les variables "lever" et "coucher" pour la date correspondante.

    Est-ce bien cela?

    2) Tu précises qu'il vaut mieux utiliser les noms des variables mais comment puis-je le faire dans ce cas précis pour la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    jours <- jours[, -2] ## mieux vaut utiliser les noms des variables...
    Merci!

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

Discussions similaires

  1. [Tableau] récupérer une partie d'un tableau
    Par keyra dans le forum Collection et Stream
    Réponses: 2
    Dernier message: 07/02/2006, 22h17
  2. Extraction d'une partie d'une chaine
    Par stk dans le forum Langage
    Réponses: 4
    Dernier message: 18/12/2005, 03h24
  3. passer une partie d'un tableau en paramettre.
    Par monstroplante dans le forum Langage
    Réponses: 13
    Dernier message: 04/11/2005, 01h22
  4. Extraction d'une partie d'une image
    Par popol666 dans le forum VB 6 et antérieur
    Réponses: 8
    Dernier message: 25/09/2005, 21h13
  5. Extraction d'une partie d'une colonne
    Par choubiroute dans le forum Oracle
    Réponses: 8
    Dernier message: 01/06/2005, 14h29

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