Formule pour utiliser la valeur précédente si elle n'est pas manquante, sinon utiliser la valeur de la dernière cellule occupéeJ'essaie d'écrire une formule dans Col3 qui ajoute la valeur actuelle de Col1 avec la valeur décalée de Col2 mais je me heurte à un cornichon en essayant de comprendre comment reporter la dernière observation de Col2 lorsque des données manquantes sont rencontrées et d'utiliser cette valeur à la première instance de données non manquantes.C'est,
If( !IsMissing( Col1)
Col1 + Lag(Col2,1);
//create variable that contains current Col2 value;
//Else
Col1 + previously stored value from Col2;
);
J'apprécierais toutes les suggestions sur la meilleure façon d'accomplir cela.Merci.
| Rangée# |
Col1 |
Col2 |
Col3 |
|---|
| 1 |
2 |
1 |
|
| 2 |
1 |
3 |
2 |
| 3 |
1 |
5 |
4 |
| 4 |
2 |
7 |
7 |
| 5 |
. |
. |
|
| 6 |
. |
. |
|
| 7 |
. |
. |
|
| 8 |
2 |
8 |
9 |
| 9 |
2 |
9 |
dix |
| dix |
1 |
11 |
dix |
| 11 |
. |
. |
|
| 13 |
. |
. |
|
| 14 |
2 |
12 |
13 |
| 15 |
2 |
13 |
14 |
| 16 |
1 |
14 |
14 |
| 17 |
2 |
15 |
16 |
Re : Formule pour utiliser la valeur précédente si elle n'est pas manquante, sinon utiliser la valeur de la dernière cellule occupéeMerci Jerry pour votre excellente explication et pour avoir anticipé ma prochaine question sur l'incorporation des identifiants !
Re : Formule pour utiliser la valeur précédente si elle n'est pas manquante, sinon utiliser la valeur de la dernière cellule occupéeDésolé de ne pas avoir donné plus d'explications dans ma réponse précédente. Tout d'abord, pour que la formule fonctionne pour votre table de données, modifiez la colonne "Date" dans les instructions "If" en "Résultat de la biopsie" et l'argument "Heure" dans la fonction Différence de date en l'intervalle dont vous avez besoin (c'est-à-dire "Jour" 
If( Row() == 1,
nm = Loc Nonmissing( :Biopsy Result << get values );
.;
,
If( Is Missing( :Biopsy Result ),
.,
Try( Date Difference( :Date[nm[Contains( nm, Row() ) - 1]], :Date, "Day" ) )
)
)
Maintenant pour l'explication. Les formules existantes n'indexent pas automatiquement vers l'arrière ou vers l'avant jusqu'à ce qu'elles trouvent des données non manquantes, j'ai donc eu recours à des scripts pour créer des variables contenant les informations nécessaires. Si vous souhaitez en savoir plus sur les scripts, l'Aide->Livres->Guide de script et Aide->Index de script sont d'excellentes ressources.
L'instruction ":Biopsy Result<
Ensuite, si le résultat de la biopsie est manquant, le résultat est défini sur manquant, sinon, nous devons faire référence à la date précédente non manquante pour le calcul de la différence de date. Contient(nm, Row()) trouve la position de la ligne courante dans la matrice "nm". Soustrayez 1 de ceci pour trouver la position de la ligne précédente dans la matrice "nm". Il s'agit maintenant de l'index, c'est-à-dire du numéro de ligne, pour la valeur Date dans la ligne avec le résultat de biopsie précédent non manquant. La fonction "Essayer" ignore l'erreur générée par la fonction Différence de date lorsqu'il n'y a pas de ligne précédente non manquante (c'est-à-dire la première instance d'un résultat de biopsie).
Quelques points à garder à l'esprit, cela suppose que vos données sont triées par date dans ID # (comme dans votre exemple). De plus, si vous avez plusieurs ID # dans votre table de données, vous pouvez ajouter une autre condition afin de ne pas comparer deux ID différents. Dans ce cas, votre formule/script pourrait ressembler à ceci :
If( Row() == 1,
nm = Loc Nonmissing( :Biopsy Result << get values );
.;
,
If( Is Missing( :Biopsy Result ),
.,
If( :ID # == :ID #[nm[Contains( nm, Row() ) - 1]],
Try( Date Difference( :Date[nm[Contains( nm, Row() ) - 1]], :Date, "Day" ) ),
.
)
)
)
Je sais que c'est beaucoup d'informations, mais vous avez dit que vous étiez "impatient d'apprendre cela"... j'espère que cela vous aidera.
Re : Formule pour utiliser la valeur précédente si elle n'est pas manquante, sinon utiliser la valeur de la dernière cellule occupéeVous pourriez trouver le Outils de tableau de données complément utile pour de tels cas.
Re : Formule pour utiliser la valeur précédente si elle n'est pas manquante, sinon utiliser la valeur de la dernière cellule occupéeMerci Jerry. Cela ressemble exactement à ce dont j'ai besoin.
Malheureusement, je suis novice dans ce domaine et j'ai encore besoin d'aide pour comprendre comment je peux le recréer moi-même dans ma propre base de données et dans l'éditeur de formules. J'ai joint une version très simplifiée de la colonne d'intérêt pour un seul patient dans mes données.
Dans ma base de données, il existe de nombreuses lignes de données avec des valeurs de laboratoire que nous suivons, cependant, seules certaines des lignes ont un résultat de biopsie. Je souhaite créer une formule qui utilisera les dates de la colonne "Dates" pour calculer la différence de date entre les biopsies chaque fois qu'elles se produisent.
Malheureusement, je ne comprends pas quelles fonctions vous avez utilisées pour créer votre formule.... par exemple... bien que si j'ai utilisé la fonction "Is missing" plusieurs fois, je ne vois même pas l'option "Loc Nonmissing" dans l'éditeur de formules.
Aussi, que signifie "nm"... Je suppose que "quelque chose de matrice" mais où puis-je trouver cela dans l'éditeur de formules ?
Désolé pour le tracas, mais je suis impatient d'apprendre cela car cela ressemble exactement à ce dont j'ai besoin.
Merci encore,
CW
Re : Formule pour utiliser la valeur précédente si elle n'est pas manquante, sinon utiliser la valeur de la dernière cellule occupéeMalheureusement, je ne vois pas l'exemple de tableau que vous avez fourni, cependant, le fichier joint pourrait vous donner une idée d'une approche pour faire la différence entre les dates non manquantes actuelles et précédentes.
La formule de la deuxième colonne établit d'abord une matrice de lignes pour les cellules non manquantes de la colonne Date. Cela fournit un moyen de référencer la ligne précédente non manquante qui est utilisée comme index dans la fonction Différence de date.
Je suis sûr qu'il y a d'autres idées pour faire ça...
Re : Formule pour utiliser la valeur précédente si elle n'est pas manquante, sinon utiliser la valeur de la dernière cellule occupéeCe que j'essaie de faire, c'est de poser la question ... quelle est la différence de date entre deux biopsies différentes (colonne intitulée TCMR) pour un patient donné (numéro de pt dans la première colonne) dans ma base de données. Les biopsies se produisent à des intervalles irréguliers et le résultat de la biopsie est indiqué dans la troisième colonne ci-dessous.
Bien que je sache comment récupérer ces informations si je crée simplement un sous-ensemble de lignes contenant uniquement un résultat de biopsie, puis demande la différence de date ... ce que je voudrais faire, c'est trouver un moyen de déterminer la différence de date entre n'importe quelle rangée contenant un résultat de biopsie tout en ignorant les rangées vides.
@jerry_cooper a écrit:
Je pense que cette formule vous donnera ce que vous recherchez:
If(Is Missing(:Column 1), :Column 1, Summation(i = 1, Row(), :Column 1))
J'espère que cela t'aides.
-Jerry
Pouvez-vous aider avec cela. Idéalement avec une solution que je peux voir dans l'éditeur de formule ou que je peux y coller.
Re : Formule pour utiliser la valeur précédente si elle n'est pas manquante, sinon utiliser la valeur de la dernière cellule occupéeJe crois que cette réponse a été écrite avant la sortie de JMP 13 qui a introduit la fonction Col Cumulative Sum(). Si vous utilisez v13 ou une version ultérieure, tout ce que vous avez à faire pour créer une colonne de somme cumulée est de cliquer avec le bouton droit sur l'en-tête de colonne de la colonne que vous souhaitez additionner et de sélectionner Nouvelle colonne de formule => Ligne => Somme cumulée. Cela créera une nouvelle colonne avec la formule appropriée. Pour voir la formule dans l'éditeur, cliquez avec le bouton droit sur la nouvelle colonne et sélectionnez Formule.
Si vous utilisez une version antérieure, copiez et collez l'instruction suivante dans l'éditeur de formule pour voir à quoi elle ressemble :
Summation(i=1, Row(), Your Column[i])
J'espère que cela t'aides.
Re : Formule pour utiliser la valeur précédente si elle n'est pas manquante, sinon utiliser la valeur de la dernière cellule occupéeJe pense que c'est exactement ce dont j'ai besoin également, mais je ne comprends pas parfaitement le script... est-il possible de montrer à quoi cela ressemblerait dans l'éditeur de formule...
Merci beaucoup
Re : Formule pour utiliser la valeur précédente si elle n'est pas manquante, sinon utiliser la valeur de la dernière cellule occupéeJe rencontre ce problème tout le temps et j'utilise la solution donnée par Jerry. J'analyse des mesures de processus (température, pression, débit, etc.) qui sont extraites d'un historien des données compressées. Tous les quelques milliers de points, il peut y avoir une valeur manquante.
L'exemple ci-dessous calcule si le réacteur fonctionne ou non en fonction de la moyenne mobile à 3 points du débit de catalyseur, F.Cat >= 11 (anonymisé oui, vous obtenez la référence...). Si F.Cat est manquant, calc utilise la valeur de la ligne précédente de "Running?".
If(
Row() < 3, 0,
Is Missing( :F.Cat ), Lag( :Name( "Running?" ), 1 ),
(Lag( :F.Cat, 2 ) + Lag( :F.Cat, 1 ) + :F.Cat) / 3 >= 11, 1,
0
)
Re : Formule pour utiliser la valeur précédente si elle n'est pas manquante, sinon utiliser la valeur de la dernière cellule occupée<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />Merci à tous pour vos commentaires et votre aide.
Je pense que la suggestion de Jerry fonctionne le mieux pour moi et ne nécessite pas l'utilisation d'une variable locale, ce que je voulais utiliser.
Re : Formule pour utiliser la valeur précédente si elle n'est pas manquante, sinon utiliser la valeur de la dernière cellule occupéeJe pense que cette formule vous donnera ce que vous recherchez:
If( Is Missing( :Column 1 ),
:Column 1,
Summation( i = 1, Row(), :Column 1 )
)
J'espère que cela t'aides.
-Jerry
Re : Formule pour utiliser la valeur précédente si elle n'est pas manquante, sinon utiliser la valeur de la dernière cellule occupéeA-t-on toujours pu avoir une formule de colonne auto-référentielle ?Je n'ai jamais réalisé que je pouvais faire ça.
Re : Formule pour utiliser la valeur précédente si elle n'est pas manquante, sinon utiliser la valeur de la dernière cellule occupéeMerci Jim et Jeff,
Je pense que j'ai rendu le problème plus compliqué que nécessaire dans ma description et la disposition de mon tableau et je peux voir comment cela peut vous avoir conduit à vos suggestions.
Bien que je comprenne votre suggestion Jeff concernant la création d'une nouvelle colonne contenant les données non manquantes, j'espère accomplir mon travail sans créer de nouvelles colonnes car j'utiliserai cette formule pour de nombreuses colonnes différentes.Permettez-moi d'essayer d'être plus clair sur ce que j'essaie d'accomplir au moyen du tableau ci-dessous.
J'essaie de créer une somme cumulée de la colonne 1 dans la colonne 2. Sans créer de colonnes supplémentaires, j'espérais créer une variable qui contient la valeur actuelle de la somme cumulée dans la colonne 2 et l'ajoute à la valeur de la colonne 1.
Mon problème est de ne pas connaître la meilleure façon de créer et d'utiliser une variable qui contient la valeur actuelle de la colonne 2 afin que cette valeur puisse être "portée" sur les lignes de données manquantes de la colonne 1.La colonne "Résultat que je recherche" montre ce que j'aimerais que la formule de la colonne 2 produise.J'espère que cette description est un peu plus claire sur ce que je cherche à accomplir.

Re : Formule pour utiliser la valeur précédente si elle n'est pas manquante, sinon utiliser la valeur de la dernière cellule occupéeJe pense qu'il y a une erreur dans votre description qu'il va falloir corriger avant de pouvoir vous donner une solution précise. Votre conditionnel dit si cela si Col1 n'est PAS MANQUANT, ajoutez-le à la valeur retardée de Col2, et si Col1 EST MANQUANT, ajoutez-le à une valeur précédemment stockée de Col2.
Vous ne pouvez pas ajouter un Col1 manquant à quoi que ce soit et obtenir autre chose que manquant.
Cela dit, je construirais ce tableau une colonne à la fois. Plus précisément, je créerais une colonne "Col2 non manquante" qui n'avait aucune valeur manquante en utilisant la formule :

Cette formule définit "Col2 non manquant" sur Col2 lorsque Col2 n'est pas manquant et le définit sur le décalage de "Col2 non manquant" lorsque Col2 est manquant.

Vous pouvez ensuite utiliser un décalage (Col2 non manquant, 1) dans votre formule finale.
J'espère que cela aide.
-Jeff
Re : Formule pour utiliser la valeur précédente si elle n'est pas manquante, sinon utiliser la valeur de la dernière cellule occupéeVoici une version de la formule qui fonctionne :
If( Row() == 1, lagval = . );
x = Sum( :col 1, lagval );
If( Is Missing( col 2 ) == 0,
lagval = :col 2
);
x;