Je souhaiterais extraire la plus longue série croissante des valeurs figurant dans une colonne d’un dataframe.
En première approche, j’ai extrait les incréments via
Code : Tout sélectionner
dev<-diff(p_frame$valeur)
dev<-c(dev,0)
J’ai ensuite extrait les écarts positifs ou nuls avec "which", puis une fonction parcourt ce tableau des indices pour trouver la plus longue série contigüe. Elle contient une grande boucle et deux accumulateurs : un pour l’indice de départ de la série testée, l’autre pour sa longueur.
Cela semble fonctionner, mais cela n'est pas très élégant en terme de complexité, et verbeux. Est-ce qu'il n'existe pas une solution plus élégante et plus proche de la philosophie de R, via le frame originel ou bien les indices du vecteur des positions ?
Code : Tout sélectionner
count_contiguous_positives<-function(param)
{
pos<-which(param>=0)
print(pos)
serie_length<-0
current_serie = 1
length_biggest_serie = 0
biggest_serie = 1
#on part de l'indice dans la deuxième cellule et on boucle
for(i in 2:length(pos))
{
current=pos[i]
previous=pos[i-1]
#on lui soustrait l'indice son prédecesseur
# si la différence est un => série positive en cours
if(current-previous==1)
{
serie_length<-serie_length+1
}
#sinon série interrompue ou courant jusqu'à la fin
else
{
#si la série est la plus longue comparée , on la garde
if(serie_length>length_biggest_serie)
{
biggest_serie=current_serie
length_biggest_serie=serie_length
}
#on réinitialise toujours le compteur de la série courante sur la position actuelle
current_serie=i
serie_length=0
}
#on teste la longueur en sortie de boucle si coupure sur série croissante
if(serie_length>length_biggest_serie)
{
biggest_serie=current_serie
length_biggest_serie=serie_length
}
}
print("biggest serie")
print(biggest_serie)
print("length biggest serie")
print(length_biggest_serie)
biggest_serie
}
cut <- count_contiguous_positives(dev)
EDIT 18 02 : le code ci-dessus ne marche pas. Version corrigée (ne passant pas par le tableau d'indices) :
Code : Tout sélectionner
count_contiguous_positives<-function(param)
{
serie_length<-1
current_serie = 1
length_biggest_serie = 0
biggest_serie = 1
for(i in 2:length(param))
{
current=param[i]
previous=param[i-1]
if(current-previous>=0)
{
serie_length<-serie_length+1
}
else
{
print(paste("break at ", i))
if(serie_length>length_biggest_serie)
{
biggest_serie=current_serie
length_biggest_serie=serie_length
}
if(i<length(param))
{
current_serie=i
serie_length=1
}
}
}
print("biggest serie")
print(biggest_serie)
print("length biggest serie")
print(length_biggest_serie)
biggest_serie
}