Bonjour,
Je travaille depuis plusieurs jours sur un programme et je me heurte à un problème dont je ne comprends pas l'origine…
Je dispose d'un tableau de données répertoriant des navires en ligne et l'observation quotidienne de leur présence (codé par 1) ou absence (codé par 0) au port. Voici un extrait du DF (les 999 remplacent les NA qui me gênaient pour la suite)
Le but de mon codage est d'obtenir la durée moyenne de sortie pour chaque bateau et de pouvoir prédire la date de retour d'un bateau qui serait sorti en ce moment (le tableau est mis à jour quotidiennement).
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 > PA [1:10, 1:10] Navire X01.01.2019 X02.01.2019 X03.01.2019 X04.01.2019 X05.01.2019 X06.01.2019 X07.01.2019 X08.01.2019 X09.01.2019 1 DHANRAJIA I 999 999 0 0 999 999 0 0 0 2 BIBINE 999 999 0 0 999 999 0 0 0 3 THALISSA 999 999 0 0 999 999 0 0 0 4 JULIANA 2 999 999 0 0 999 999 0 0 0 5 JO LEA 999 999 0 0 999 999 0 0 0 6 SAINT AMANDIER 999 999 0 0 999 999 0 0 0 7 BLANCHE NEIGE 999 0 0 0 0 0 0 0 0 8 MACHOIRAN BLANC 999 999 0 0 999 999 1 1 1 9 PIMENTADE III 999 999 0 0 999 999 0 0 0 10 DIGNA 999 999 0 0 999 999 0 0 0
Pour cela, j'ai voulu créer un nouveau tableau où je stock les dates de départ et de retour des navires grâce à un système de boucles FOR et IF.
Pour résumer : je compare les cellules 2 à 2 de façon à trouver les premiers 1 et les derniers 1 de chaque série et à extraire les dates correspondantes.
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
33
34 # Création d'un vecteur contenant les dates d'observation (utilisable dans la boucle) Date <- colnames(PA[,2:ncol(PA)]) # on récupère les noms des colonnes de PA Date <- gsub(pattern = "X", replacement = "", Date) # On supprime le X placé devant les dates lors de l'importation des données Date <- as.Date(Date,"%d.%m.%y") # On convertie au format date Date <- Date[-which (is.na(Date)== T)] # On enlève les cellules qui n'ont pas de dates # On supprime du tableau PA les colonnes qui n'ont pas encore de données d'observation PA <- PA[,1:(length(Date)+1)] # Création d'un tableau vide où s'ajouteront les noms des navires, les dates de début de marée et la durée des marées BatDat <- data.frame(matrix(NA, ncol = 4)) colnames(BatDat) <- c("Navire", "Début_marée", "Fin_marée", "Durée_marée") z1 <- 1 # Création d'un compteur permettant de dénombrer le nombre de lignes de BatDat pour les dates de début de marée z2 <- 1 # Création d'un compteur permettant de dénombrer le nombre de lignes de BatDat pour les dates de fin de marée for (n in 1 : nrow(PA)){ # on parcourt les lignes du tableau for(k in 3 : ncol(PA)){ # on parcourt les colonnes du tableau à partir de la 3ème, cad la seconde date pour que le k-1 soit aussi une date if (((PA[n,k-1] == 0) & (PA[n,k] == 1)) | ((PA[n,k-1] == 999) & (PA[n,k] == 1))) # On compare, pour un bateau donné, l'état de présence/absence afin de détecter les débuts de marée # print("Début de marée") z1 = z1 + 1 # z augmente de 1 à chauqe fois qu'une marée débute BatDat[z1,1] <- PA[n,1] # on stock le nom du bateau dans BatDat BatDat[z1,2] <- format(Date[k], "%j") # on stock la date de début de marée dans BatDat } } for (n in 1 : nrow(PA)){ # on parcourt les lignes du tableau for(k in 3 : ncol(PA)){ # on parcourt les colonnes du tableau à partir de la 3ème, cad la seconde date pour que le k-1 soit aussi une date if ((PA[n,k-1] == 1) & (PA[n,k] == 999) | ((PA[n,k-1] == 1) & (PA[n,k] == 0))) # On compare, pour un bateau donné, l'état de présence/absence afin de détecter les débuts de marée z2 = z2 + 1 # z augmente de 1 à chauqe fois qu'une marée finit # print("Fin de marée") BatDat[z2,3] <- format(Date[k], "%j") # on stock le nom du bateau et la date de début de marée dans un tableau } }
Dans l'idée, mon code marche plutôt bien.
Le problème c'est que, quand il arrive au bout d'une ligne, il compare la dernière cellule avec la première cellule de la ligne suivante, ce qui fausse totalement l'extraction des dates…
Par exemple, avec l'extrait fourni : pour le navire "Machoiran blanc", j'obtiens une date de départ le 07/01/2019 et en date de retour le 01/01/2019. Bref, il est rentré avant de sortir ! (Ils sont forts, ces pêcheurs !)
Voilà, si quelqu'un à une idée pour régler ce problème, je suis preneuse ! Ou, éventuellement, une façon plus élégante de faire l'extraction des dates…
J'ai essayé d'insérer la fonction "next" dans mon code mais ça n'a rien donné. J'ai également essayé de voir pour appliquer des fonctions de type "ifelse" ou "apply" mais je vois pas trop comment elles peuvent résoudre mon problème…
Merci !
Partager