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)

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
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).
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.

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
  } 
}
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.
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 !