J'essaie de trouver une voie bien rangée pour ajuster dynamiquement un seuil comme je "déplacer" à travers un tibble à l'aide de la bibliothèque J'essaie de calculer un seuil qui commence par la valeur initiale (2) et les incréments d'un montant préspécifié (dans ce cas, 1 ) Sauf si l'observation actuelle est supérieure à celle de ce seuil auquel cas l'observation actuelle em> devient le seuil de référence et d'autres seuils d'incrément de celui-ci. Voici ce que le Tibble final ressemblerait à: p> Je cherche la meilleure façon de le faire en utilisant dplyr / rangé. Toute aide est appréciée! P> EDIT: P> Les réponses jusqu'à présent sont très proches, mais manquez dans le cas où les valeurs observées abandonnent et augmentent à nouveau. Par exemple, considérez le même treibble que (Tairyverse) Code>. Par exemple, imaginez une tibble contenant des observations séquentielles:
exemple code> ci-dessus, mais avec un
4 code> au lieu d'un
3 code> pour l'observation finale: p>
example %>%
group_by(gr = cumsum(c(TRUE, diff(observed) > thresh))) %>%
mutate(thresold = first(observed) + row_number() - 1) %>%
ungroup %>%
select(-gr)
A tibble: 11 x 2
observed thresold
<dbl> <dbl>
1 2 2
2 1 3
3 1 4
4 2 5
5 2 6
6 4 4
7 10 10
8 4 11
9 2 12
10 2 13
11 4 4
3 Réponses :
Vous pouvez utiliser Pour comprendre comment les groupes sont créés ici sont les étapes détaillées: p> Nous calculons d'abord la différence entre les valeurs consécutives P> Notez que Nous la comparons avec maintenant puisque la sortie de puis Enfin, prenez edit fort> p> pour la question mise à jour, nous pouvons ajouter une autre condition à la vérification de la valeur précédente est supérieure au nombre actuel et mettez à jour les valeurs en conséquence. P> diff code> pour créer des groupes et ajouter un numéro de ligne dans le groupe à la valeur code> code>.
Diff donne la sortie de la longueur 1 inférieure à la longueur réelle. p>
orthèse code> qui donne
true code> pour chaque fois que nous avons une valeur supérieure au seuil p>
diff code> a une valeur moins que nous ajoutons une valeur que
true code> p>
cumsum code> pour créer des groupes utilisés dans
group_by code>. p>
example %>%
group_by(gr = cumsum(c(TRUE, diff(observed) > thresh) &
observed > first(observed) + row_number())) %>%
mutate(thresold = first(observed) + row_number() - 1) %>%
ungroup() %>%
select(-gr)
# A tibble: 11 x 2
# observed thresold
# <dbl> <dbl>
# 1 2 2
# 2 1 3
# 3 1 4
# 4 2 5
# 5 2 6
# 6 4 7
# 7 10 10
# 8 4 11
# 9 2 12
#10 2 13
#11 4 14
Cela semble fournir exactement le résultat que je veux. J'ai du mal à comprendre exactement ce que le cumsum (c (vrai, diff (observé)> bath)) code> fait, cependant. Avez-vous un lien que vous pourriez partager cela peut l'expliquer?
@Colton J'ai ajouté des explications sur cette ligne.
Je ne suis pas sûr que cela résout le problème. Par exemple, considérons si la dernière valeur observée est un 4 au lieu d'un 3. Le seuil finit par diminuer au lieu d'incrémenter sur la dernière valeur. J'ai mis à jour ma description pour inclure cet exemple.
@Colton Si la dernière valeur est 4, la différence est supérieure au seuil d'où un nouveau groupe est créé à partir de là. La valeur seuil de chaque groupe est la première valeur du numéro de groupe +. Quelle sortie attendriez-vous dans ce cas?
Le seuil ne devrait jamais diminuer car les observations se poursuivent, comme indiqué dans ma réponse originale Tibble. Le seuil augmente continuellement par la quantité préspécifiée (1), sauf si une valeur observée n'est plus importante auquel cas le seuil augmente à cette valeur observée.
@Colton Pouvez-vous vérifier ma réponse mise à jour après Modifier B>?
Nous pouvons créer la variable de regroupement avec lag code> de la différence de colonne
Cette réponse semble très proche, mais échoue dans le cas, par exemple, que la valeur finale observée est un 4 code> plutôt qu'un
3 code>. (Il trouve le seuil final comme
12 code> plutôt que
14 code>).
Je pense que j'ai trouvé un moyen de faire cela, en utilisant zoo :: LOCF (bien que je ne suis pas sûr que cette partie soit vraiment nécessaire).
Créez d'abord le plus difficile des deux exemples que j'ai répertorié dans ma description: p> résultat: p> Je préférerais certainement une solution plus élégante si quelqu'un en trouve un . p> p>
Pouvez-vous vérifier les valeurs entre 5 et 6. il est supérieur à 1
@akrun - Il n'y a pas de stipulation que les valeurs observées doivent être <= 1 sur des mesures séquentielles
Votre 6ème rangée ne s'aligne pas avec le seuil
Il est correct tel quel, le seuil devrait continuer à incrémenter sauf si la valeur observée n'est supérieure au seuil.
La partie
continue d'incrémenter sauf si la valeur observée est supérieure au seuil code> n'est pas clair pour moi. Le seuil est 1
En regardant mon
Analyse d'origine Code> Tibble, AVIS Lorsque vous déplacez le TIBble, le seuil code> La valeur code> incrémente par 1
(2,3,4, ...) < / code>. La ligne numéro 7 aurait une valeur seuil de
8 code>, mais puisque la valeur observée de
10 code> est supérieure à code> 8 code> le seuil hérite du
10 code>. Le seuil continue ensuite d'incrémenter de
10 code> à la fin du Tibble
(11,12,13,14) code>.
Vous pouvez vérifier ma mise à jour