Bonjour à tous,

C'est ma première publication dans un forum de coding et je ne suis pas une grande pro de R donc j'espère bien exposer le problème.
Je manipule des données GPS qui sont souvent dans l'eau. Elles se présentent sous la forme d'un tableur avec les colonnes GPS (qui identifie l'individu, c'est plus un repère qu'autre chose car ici il a la même valeur pour toutes les positions, Date, Time, Latitude, Longitude et Altitude. Lorsque la sonde est immergée, on ne reçoit plus de signal pendant parfois très longtemps, ce qui fait lagger l'enregistrement de position. On passe d'une ligne bien enregistrée (appelons-la ici ref1) et à une ligne enregistrée plusieurs heures plus tard, avec les exactes mêmes coordonnées que ref1 (appelons-la ici ref2). Je ne peux pas montrer les données pour des questions de confidentialité.
J'ai donc deux choses à faire pour lisser le jeu de données : recréer et estimer les positions manquantes selon un certain pas de temps (que j'ai fixé à 65 minutes au vu des relevés disponibles) et corriger tous les ref2 erronés. Pour cela, je procède à une interpolation linéaire. J'ai écrit ce code :

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
 
df$DateTime <- as.POSIXct(paste(df$Date, df$Time), format="%d/%m/%Y %H:%M:%S")
 
# Générer les positions manquantes toutes les 65 minutes environ (1 heure et 5 minutes)
new_timestamps <- seq.POSIXt(from = min(df$DateTime), to = max(df$DateTime), by = dminutes(65))
 
# Recréer une df entière avec tous les points recréés
df_complete <- expand.grid(GPS = unique(df$GPS), DateTime = new_timestamps)
 
# Merge l'originale et la nouvelle df
df_merged <- merge(df, df_complete, by = c("GPS", "DateTime"), all = TRUE)
 
# Tri
df_merged <- df_merged[order(df_merged$GPS, df_merged$DateTime),]
 
# Interpolation linéaire sur les nouvelles positions GPS : elles sont encore vides, donc indiquent "NA"
#on les repère grâce au na.rm = FALSE
df_result <- transform(df_merged,
                       Latitude = na.approx(Latitude, DateTime, na.rm = FALSE),
                       Longitude = na.approx(Longitude, DateTime, na.rm = FALSE),
                       Altitude = na.approx(Altitude, DateTime, na.rm = FALSE)) %>%
  select(-Date,-Time)
 
print(df_result)
Le tableau sortant a l'air prometteur : la première fois qu'il a recours à l'interpolation linéaire, il le fait bien, que ça soit pour les nouvelles données que pour corriger la position erronée. Puis à partir de la deuxième fois, et pour toutes les autres, toutes les positions qui ont été recréées à partir d'un trou temporel, ainsi que les ref1 et ref2 qui les bornent, ont exactement les mêmes valeurs. J'ai essayé de contourner le problème en faisant référence à des groupes, en définissant tous les ref1 et ref2 et organisant des groupes de valeurs entre ces repères par exemple. J'ai même poncé ChatGPT mais rien n'y fait...

J'ai la tête dans le guidon depuis des jours avec ce problème et je ne vois plus quoi faire. Je vous serais très reconnaissante pour votre aide, merci d'avance