Traitement de données climatologiques

Postez ici vos questions, réponses, commentaires ou suggestions - Les sujets seront ultérieurement répartis dans les archives par les modérateurs

Modérateur : Groupe des modérateurs

Julien Cattiaux
Messages : 26
Enregistré le : 20 Mar 2007, 16:48

Traitement de données climatologiques

Messagepar Julien Cattiaux » 21 Mar 2007, 09:58

Bonjour à tous,

J'utilise R quasiment pour la première fois et j'ai à traiter des données climatologiques (précipitations journalières depuis 1886 pour les plus anciennes, provenant de 1527 stations de mesure différentes...). J'ai deux questions, mais avant de les poser, je vous fais une rapide description de l'organisation de mes données.

Elles sont en fait rangées dans des fichiers, un fichier contenant chacun les données d'une station de mesure. Ces fichiers sont donc nommés (en gros) station000001.txt station000002.txt etc.. jusqu'à station001527.txt, et sont organisés comme suit :

DATE RAINFALL
18860101 0
18860102 30
18860103 4
...
20061204 5
20061205 0

(la date est sous le format yyyymmdd)

1e question : J'aimerais pouvoir créer une liste qui contienne la date en première "colonne" puis les precipitations des différentes stations à partir de la colonne 2.
En gros qqch du type :
DATE RAINFALL_STATION000001 RAINFALL_STATION000002 ....
Ce ne serait pas compliqué si mes fichiers s'appelaient station1.txt station2.txt etc.., mais là il y a les zéros qui gênent !! Et c'est con mais du coup je n'arrive pas à incrémenter ma boucle. Qqn a-t-il une idée ?

2e question : J'aimerais écrire une fonction qui me permette de "sélectionner" une certaine période dans mes données (par ex. l'année 2003). Typiquement :
dataperiod=function(données,date1,date2)
(où pour l'année 2003 date1=20030101 et date2=20031231)
Cette fonction me sortirait la même structure que dans ma première question, mais ne conservant que les lignes (données) comprises entre date1 et date2.
Est-ce que R peut faire cela facilement ? En particulier est-ce qu'il peut reconnaître l'indice de la ligne qui correspond à une certaine date ?

Merci d'avance pour vos réponses
Julien

PS. Si vous voulez savoir quel temps il faisait le jour de votre naissance, vous pouvez me demander =)

Logez Maxime
Messages : 3138
Enregistré le : 26 Sep 2006, 11:35

Messagepar Logez Maxime » 21 Mar 2007, 10:10

Bonjour,

Juste un petit coup de main pour récupérer tes fichiers :

Code : Tout sélectionner

for (i in c(1,10,100,1000)){ print(paste("station",paste(rep(0,6-nchar(i)),collapse=""),i,".txt",sep=""))
}
[1] "station000001.txt"
[1] "station000010.txt"
[1] "station000100.txt"
[1] "station001000.txt"

Donc si tes noms de fichies ont tous le même nombre de caractères tu devrais t'en sortir facilement pour les incorporer dans R avec un truc du style :

Code : Tout sélectionner

data <- list()
for (i in c(1,10,100,1000)){ auxi <- paste("station",paste(rep(0,6-nchar(i)),collapse=""),i,".txt",sep="")
data[[i]] <- read.table(auxi,...)
}


Maxime

Julien Cattiaux
Messages : 26
Enregistré le : 20 Mar 2007, 16:48

Messagepar Julien Cattiaux » 22 Mar 2007, 09:10

Merci à toi, ça marche bien. Sauf que je me suis rendu compte que j'ai des fichiers manquants, par exemple station000008.txt n'existe pas, donc si je fais une boucle pour (i in 1:10), il s'arrete à 7, et sort un message d'erreur (logique!) à 8. Tu saurais comment faire pour "sauter" les indices pour lesquels il n'y a pas de fichier ?

Quant à ma 2e question "Est-ce que R sait reconnaitre l'indice pour lequel DATE vaut 20070322 par exemple ?", si qqn a une réponse ça m'intéresse vraiment !

Merci d'avance,
Julien

Logez Maxime
Messages : 3138
Enregistré le : 26 Sep 2006, 11:35

Messagepar Logez Maxime » 22 Mar 2007, 09:35

Bonjour,

Pour la première question pour le moment je n'y ai pas réfléchi quand à ton indexation c'est assez simple il te suffit d'utiliser la fonction which :

Code : Tout sélectionner

annee <- 2001:2010
annee
[1] 2001 2002 2003 2004 2005 2006 2007 2008 2009 2010
which(annee=="2004")
4


Pour ta première question tu peux peut être voir du côté de choose.files si tout tes fichiers txt sont dans le même répertoire, avec un truc du style auxi <- choose.files() et après une boucle du genre for (i in 1:length(auxi)){ data[i] <- read.table(auxi[i],...)}

Maxime

Nicolas Péru
Messages : 1408
Enregistré le : 07 Aoû 2006, 08:13

Messagepar Nicolas Péru » 22 Mar 2007, 09:40

pour la première question la plage des i peut être spécifiée avec un vecteur aussi :

Code : Tout sélectionner

> x = 1:10
> x
 [1]  1  2  3  4  5  6  7  8  9 10
> for (i in c(1:5,7:10)){x[i]=x[i]+10}
> x
 [1] 11 12 13 14 15  6 17 18 19 20


Donc là il ignore la 6ème valeur du vecter lorsqu'il remplace en ajoutant 10.

Logez Maxime
Messages : 3138
Enregistré le : 26 Sep 2006, 11:35

Messagepar Logez Maxime » 22 Mar 2007, 10:01

Nicolas Péru a écrit :pour la première question la plage des i peut être spécifiée avec un vecteur aussi :

Code : Tout sélectionner

> x = 1:10
> x
 [1]  1  2  3  4  5  6  7  8  9 10
> for (i in c(1:5,7:10)){x[i]=x[i]+10}
> x
 [1] 11 12 13 14 15  6 17 18 19 20


Donc là il ignore la 6ème valeur du vecter lorsqu'il remplace en ajoutant 10.


Oui mais tu as plein de valeurs a trou et pas mal de fichiers ça devient vite problématique. Mais je n'ai pas de solutions autres que de sélectionner les fichiers.

Maxime

Nicolas Péru
Messages : 1408
Enregistré le : 07 Aoû 2006, 08:13

Messagepar Nicolas Péru » 22 Mar 2007, 10:09

Oui mais tu as plein de valeurs a trou et pas mal de fichiers ça devient vite problématique


C'est sûr c'est une solution de base, lorsque les choses ne sont encore pas trop complexe. :)

Logez Maxime
Messages : 3138
Enregistré le : 26 Sep 2006, 11:35

Messagepar Logez Maxime » 22 Mar 2007, 11:56

Re,


Si tu sais quels sont les numéros de station ou tu n'as pas l'info tu peux faire un truc du genre :

Code : Tout sélectionner

x <- 1:10
#le numéro 7 et 9 n'existent pas
x <- x[-c(7,9)]
Et faire la boucle sur x.
Sinon tu peux aussi créer une condition dans la boucle du genre si i=9 alors je passe aux i suivant : if(x=9) next ... Je pense que la mpreière solution est la plus sympa parce que ça évite de faire une condition dans la boucle.

Maxime

Julien Cattiaux
Messages : 26
Enregistré le : 20 Mar 2007, 16:48

Messagepar Julien Cattiaux » 22 Mar 2007, 13:07

J'ai bien noté, et c'est plus ou moins ce que je faisais jusqu'ici, vu que je ne travaillais que sur quelques stations, donc que je n'avais aucun problème pour sélectionner les numéros des fichiers manuellement.

Mais là je dois travailler sur l'ensemble de mes stations, donc sur l'ensemble de mes fichiers. En tout il y a environ 1200 fichiers, numérotés de 1 à 1527 : il y a donc environ 300 fichiers "manquants", et tu imagines bien que je ne me suis pas amusé à les répertorier.

Je voulais en fait savoir s'il était possible de mettre une condition sur l'existence (ou non) du fichier à chaque itération, du style :
pour i de 1 à 1527
si station_i.txt existe, alors faire ...

Qu'en pensez-vous ?

Julien

Logez Maxime
Messages : 3138
Enregistré le : 26 Sep 2006, 11:35

Messagepar Logez Maxime » 22 Mar 2007, 13:26

Re,


Tu peux faire ça je viens de voir avec list.files, qui va chercher dans un dossier le nom des fichiers contenus dans celui-ci donc si ton répertoire de travail contient tes 1200 fichiers il te suffit de faire la boucle comme ceci :

Code : Tout sélectionner

auxi <- list.files(pattern=".txt")# si tu veux que les fichiers texte par exemple ...
data <- list()
for (i in 1:length(auxi)){
data[[i]] <- read.table(auxi[i],...)
}

Tu liras bien tout les fichiers de ton dossier par se moyen la.

Maxime


Retourner vers « Questions en cours »

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 1 invité