Bonjour,
Voici mon petit soucis. J'utilise actuellement une boucle dans une fonction afin d'identifier des valeurs comme fausses. Voici mon code:
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
| out2NA <- function(x,seuil){
st1 = NULL
# Variable temporaire mémorisant la dernière valeur "correcte" relevée #
temp <- st1[1] <- x[1]
# Conserver l'indice de la valeur tampon #
ind_temp <- 1
# Définir ecart_temps max entre 2 comparaisons #
ecart_temps <- 15
# Conserver les temps de chaque élément de la série temporelle #
tps <- time(x)
# Suppression des valeurs absolues dont l'écart avec la précédente est >= au seuil défini
# et suppression des valeurs suivantes si la valeur aberrante se répète #
for (i in 2:length(x)){
if((!is.na(x[i])){
if((tps[i]-tps[ind_temp] < ecart_temps) & (abs(x[i]-temp) > seuil)){
st1[i] <- NA
}
else {
temp <- st1[i] <- x[i]
ind_temp <- i
}
}
}
return(st1)
} |
Pour l'instant, il fonctionne bien ainsi. Il compare la valeur x[i] avec la valeur temporaire mémorisée, et regarde si l'écart temporel entre les 2 données n'est pas trop important. Mais comme il ne détecte pas tout à fait ce que je veux, j'aimerais lui rajouter une condition supplémentaire dans cette ligne:
1 2
| if((tps[i]-tps[ind_temp] < ecart_temps) & (abs(x[i]-temp) > seuil)
&(abs(x[i+1]-x[i])<1)){ |
Il ferait donc la même chose qu'avant, mais avec en plus une comparaison entre la valeur x[i] et la valeur qui la suit juste derrière x[i+1].
En testant ainsi, j'ai la réponse: "valeur manquante là où true/false est requis".
Je rajoute donc dans cette ligne:
if((!is.na(x[i])&(!is.na(x[i+1])){
et si je teste à nouveau, j'ai l'erreur suivante: "le nombre d'objets à remplacer n'est pas multiple de la taille du remplacement "
J'ai donc essayé en changeant length(x) ou en utilisant dim(x), pensant que c'est le x[i+1] qui pose problème pour le calcul (et donc un problème de longueur du vecteur pour les comparaisons), mais je n'arrive pas pour l'instant.
Quelqu'un pourrait-il m'aider?
Merci d'avance!
Partager