Vous cherchez à générer deux colonnes basées sur un modèle provenant d'autres colonnesSalut tout le monde,
Je cherche à générer deux nouvelles colonnes basées sur des modèles dans deux autres colonnes (« Colonne1 requise » et « Colonne2 requise »). Veuillez voir l'image ci-jointe -

Une aide/suggestion ?
Merci.
Ingénierie Qualité et ProcédésRe : Vous cherchez à générer deux colonnes basées sur un modèle provenant d'autres colonnesMerci @jthi pour une belle explication.
Re : Vous cherchez à générer deux colonnes basées sur un modèle provenant d'autres colonnes1. Peut-être que cette image explique pourquoi la première idée ne fonctionnera pas (si je me souviens bien, la deuxième solution repose sur cela si vous calculez . + 1 ce sera . 

J'ai pris les différentes comparaisons de l'instruction If et j'ai simplement créé des formules à partir d'elles afin qu'il soit plus facile de voir ce qui renvoie True et quand.
Vous pourriez très probablement faire fonctionner la première solution en modifiant un peu les comparaisons ( Est manquant (:StartEnd) & Lag(:StartEnd) != "Fin" | :StartEnd == "Fin", val += 1 ). Mais avec ce changement, vous devrez également apporter de petites modifications à la deuxième comparaison (ajouter Row() != Col Max(Row()) check).
2. Idée pour Row() == Col Max(Row()) & :StartEnd == "Démarrer" est juste pour vérifier si nous sommes sur la dernière ligne du tableau et que la valeur :StartEnd est "Start", nous ne définirons pas la valeur sur 1 en fonction de l'instruction if précédente. Row() vous indiquera le numéro de ligne et Col Max(Row()) vous renverra le numéro de ligne maximum dans la table de données. Cela peut être une vérification un peu inutile car il s'agit de la dernière ligne du tableau (comme celle qui suit avec Début/Fin), mais comme c'était dans la colonne des résultats, je les ai implémentés.
L'idée générale avec le dernier if-else était la suivante :
1. Lag(:StartEnd) == "End" -> c'est un "stop" général après que End soit contré
2. Row() == Col Max(Row()) & :StartEnd == "Start" -> pour éviter de renvoyer 1 sur la dernière ligne si c'est Start
3. :StartEnd == "Start" & Lag(:StartEnd, -1) == "End" -> pour éviter de renvoyer 1 et 2 s'il n'y a pas de lignes entre Start et End
Vous pouvez en utiliser un seul avec plusieurs comparaisons en déplaçant un peu certaines comparaisons (cela semble renvoyer le même résultat que Req1) :
If(
Row() == 1, val = .,
Row() != Col Max(Row()) & :StartEnd == "Start" & Lag(:StartEnd, -1) != "End", val = 1,
Is Missing(:StartEnd) & Lag(:StartEnd) != "End" | :StartEnd == "End", val += 1,
val =.
)
J'espère que l'explication n'est pas trop compliquée
Re : Vous cherchez à générer deux colonnes basées sur un modèle provenant d'autres colonnesSalut tout le monde,
J'ai une autre question, en fait deux -
1. Quelle est la différence si j'ajoute plus d'une condition dans une seule instruction "If" et si j'ajoute plus d'une instruction "If" avec une seule condition. Voir l'image ci-jointe - . Le premier cas ne donne pas de résultats corrects tandis que le deuxième fonctionne correctement. Les résultats peuvent être vus dans les exemples de données ci-joints. J'ai du mal à comprendre les différences ici.
Il me semble que pour chaque ligne – dans le premier cas, si la condition est vraie, la sortie est donnée. Ceci met fin aux résultats.
Dans le deuxième cas, il exécutera les 3 instructions if de manière séquentielle, quels que soient les résultats de la précédente et la sortie sera basée sur la dernière condition vraie. Je ne suis pas sûr de pouvoir l'expliquer correctement. Encore une fois, je suppose que dans le 2ème cas (instruction if multiple), il y a une sorte d'écrasement sur l'instruction If précédente !

2. Il y a une condition utilisée dans la formule ci-dessus -- " Row() == Col Max(Row()) & :StartEnd == "Start" " Comment ça marche ? Cela fonctionne bien, c'est-à-dire que c'est bien écrit. Mais je n'arrive pas à visualiser comment la variable/compteur "val" s'arrête ?
Une aide avec ça ?
Merci,
Re : Vous cherchez à générer deux colonnes basées sur un modèle provenant d'autres colonnesCher @jthi (Jarmo) et cher @txnelson (Jim),
Je suis vraiment reconnaissant pour votre soutien et votre gentillesse.
Je trouverai certainement une méthode efficace par l'une ou l'autre de ces deux méthodes et une combinaison de ces deux.
Un grand merci encore à vous deux.
Joyeux Noel et bonne année. Profitez de votre temps.
Cordialement,
Harry
Re : Vous cherchez à générer deux colonnes basées sur un modèle provenant d'autres colonnesJ'ai essayé avec ça. J'essaie d'éviter d'utiliser Lag() autant que possible et de le remplacer par des fonctions Col. La formule la plus difficile semble être Colonne 1 obligatoire et je n'ai pas pu trouver rapidement une bonne formule sans utiliser Lag() (il existe probablement une solution avec Col Cumulative Sum d'une manière ou d'une autre). Une idée serait de remplir les espaces entre le début et la fin avec "En cours" ou quelque chose de similaire, alors vous pourriez peut-être utiliser Col Cumulative Sum plus facilement, mais la formule la plus difficile serait probablement simplement déplacée vers Début et fin .
Voir plus... Si vous avez le temps, je vous suggère de tester les deux façons de résoudre ce problème, celle @txnelson a fourni une utilisation plus intensive de Lag et de comparaisons, et celle que j'ai avec les formules Col. Les deux ont certainement leurs cas d'utilisation et les comprendre vous aidera à long terme lors de l'écriture de formules/calculs dans JMP. Et dans certains cas, lorsque vous comprenez comment combiner les deux, vous pouvez résoudre des tâches assez difficiles avec uniquement des formules.
De plus, une fois que la logique fonctionne, je supprimerais très probablement les formules de la table de données (ou remplacerais Formula() par << Définir chaque valeur dans le script), car cela risquerait de se briser si l'ordre est modifié dans la table de données.
Re : Vous cherchez à générer deux colonnes basées sur un modèle provenant d'autres colonnesMerci @txnelson ,
J'ai fait quelques progrès - et j'ai identifié correctement le point de début et de fin de chaque série. J'ai utilisé une logique très simple, vous pouvez le voir dans la colonne de formule.
Mais maintenant, j'ai du mal à mettre des chiffres entre chaque paire de points "Début" et "Fin". J'ai du mal à arrêter le compteur à "Fin". Mon problème est peut-être la même complexité, mais au moins maintenant, j'ai un marquage/une balise effacée sur mon point de départ et mon point d'arrivée.
Une aide avec ça ?
Merci.

Merci.
Re : Vous cherchez à générer deux colonnes basées sur un modèle provenant d'autres colonnesLe problème semble provenir de la logique appliquée à la variable JSL "autre".Je n'ai pas le temps de travailler sur le sujet aujourd'hui, mais demain après-midi, je devrais pouvoir faire une enquête.
Re : Vous cherchez à générer deux colonnes basées sur un modèle provenant d'autres colonnesSalut Jim,
Désolé pour la confusion.
Votre formule originale (je crois que je ne l'ai pas gâchée) a fonctionné dans la plupart des cas, mais a également capturé quelques points erronés et en a manqué quelques-uns sur l'ensemble des données. Dans le sous-ensemble de données ci-joint (uniquement pour un "ID" et une valeur de "Sous-ensemble"), il y a une colonne basée sur votre formule qui contient quelques points erronés.
Lignes : 647-649 mauvaise entrée (couleur rouge)
Rangées : 868 à 937 non capturées (couleur rouge)
Lignes : 1 307 à 1 311 entrée erronée (couleur rouge)
Et cela a été corrigé lorsque j'ai mis la condition sur :Occurrence.
Maintenant, je cherche -
1. Dernier capteur primaire en occurrence = n (disons n = 2), marquez-le comme "Démarrer"
2. Premier capteur primaire en occurrence = n+1 (= 3), et s'il n'y a pas de capteur primaire pour n = 3, il doit arrêter/marquer la valeur dans Occurrence = n+2 == 4. Marquez-le comme "Fin"
3. Et enfin, remplissez les chiffres entre "Début" et "Fin" dans une nouvelle colonne.
Une autre façon de penser à (peut-être) --
Si nous pouvons marquer - dans une seule occurrence n (n = 2) le premier capteur primaire comme FIN et le dernier capteur primaire comme Début, puis remplir une valeur entre Début et Fin dans une nouvelle colonne.
J'espère que cela aidera et clarifiera les choses.
Merci,
Je pense que c'est possible, si je peux trouver un
Re : Vous cherchez à générer deux colonnes basées sur un modèle provenant d'autres colonnesje suis confus.D'après ce que je peux voir, le script que j'ai écrit semble fonctionner, sauf qu'après la ligne 44 de la table de données, vous avez modifié les règles et souhaitez maintenant que la fin soit sur la ligne précédant la valeur suivante de Primary.Qu'est-ce que tu veux ?

Re : Vous cherchez à générer deux colonnes basées sur un modèle provenant d'autres colonnesSalut @txnelson , Merci pour votre réponse.
Je ne parviens pas à obtenir le point de départ correct (exigence mise à jour). Dans le tableau de données ("Sample Data Updated") et l'image, j'avais saisi manuellement les colonnes de données corrigées.
La formule. J'avais l'habitude d'obtenir "Ancienne colonne 1 requise" et "Ancienne colonne 2 requise" est-ce (c'est exactement comme vous me l'avez donné, j'ai ajouté une condition d'occurrence dessus) -
RCValue = "";
:Required Column 1[Row()] = .;
If( :Occurrence != Lag( Occurrence, -1 ),
other = "Yes"
);
If( Row() == 1 | :ID != Lag( :ID ) | :"Sub-set"n != Lag( :"Sub-set"n ),
counter = 0;
withinStart = "No";
other = "Yes";
);
If(
:Sensor == "Primary" & :Occurrence == Lag( :Occurrence, -1 ) & Dif( :Occurrence ) == 0 &
withinStart == "Yes",
RCValue = "End";
withinStart = "No";
other = "No";,
:Occurrence != Lag( Occurrence, -1 ) & Lag( :Sensor, -1 ) != "Primary" & withinStart == "No"
& other == "Yes" & Row() != N Rows( Current Data Table() ),
withinStart = "Yes";
counter = counter + 1;
RCValue = "Start";
);
If( withinStart == "Yes" | RCValue == "End",
:Required Column 1[Row()] = counter
);
RCValue;

Merci beaucoup.
Re : Vous cherchez à générer deux colonnes basées sur un modèle provenant d'autres colonnesVous avez modifié le code que j'ai fourni précédemment pour obtenir les résultats que vous fournissez dans votre réponse la plus récente. Veuillez fournir le JSL que vous utilisez pour obtenir les résultats que vous affichez dans votre exemple de tableau de données.
Re : Vous cherchez à générer deux colonnes basées sur un modèle provenant d'autres colonnesSalut @txnelson et tout,
J'ai pu modifier votre code parfaitement en fonction de mes besoins. Mais lors du dépannage de la deuxième étape, j'ai besoin de quelque chose comme ça :
Marque : Capteur = "Primaire" (1er) autour d'un changement consécutif dans : Occurrence.Dans la capture d'écran donnée -
valeurs requises entre les deux --- Dernière "Primaire" dans Occurrence = 2 et Premier "Primaire" dans Occurrence = 3 [changement consécutif d'occurrence]
Trouver la première primaire n'est pas si difficile, vous ne savez pas comment trouver la dernière primaire ? En pensant inverser d'une manière ou d'une autre (ordre décroissant) les données du sous-ensemble pour Occurrence = 2, recherchez la valeur, puis rétablissez-la. Impossible de mettre une formule !! Une autre façon de faire ça ?
De l'aide?
Merci.

Re : Vous cherchez à générer deux colonnes basées sur un modèle provenant d'autres colonnesSalut @txnelson ,
Cela a presque fonctionné avec quelques fausses entrées. Je pense que nous devons ajouter une condition supplémentaire sur la colonne :Occurrence. C'est-à-dire :L'occurrence doit changer pour définir :Required Column 2 == "Start" (et peut être une option - cela devrait être le même lorsque :Required Column 2 == "End").
Quelque chose comme - Dif(:Occurrence) !=0 alors seulement :Required Column 2 == "Start"
Pour mes exemples de données (95 lignes), votre formule convenait, mais mes données réelles, qui contiennent plus de 300 000 lignes, donnent de nombreuses entrées erronées comme ci-dessous - (je pense que cela devrait aller une fois qu'une exigence supplémentaire sur : Occurrence sera ajoutée. ) Ceci n'est qu'une capture d'écran d'une mauvaise entrée.

Avec un peu de chance!!Je peux modifier la formule/le code et ajouter l'exigence de :Occurrence. en plus de votre formule.
Merci encore pour votre soutien.
Re : Vous cherchez à générer deux colonnes basées sur un modèle provenant d'autres colonnesVoici une formule pour la colonne à laquelle vous faites référence à la colonne obligatoire 2.Lorsque vous étudiez le code, vous verrez qu'il ne fait qu'appliquer les règles logiques que vous avez indiquées et qui doivent être vérifiées lors de la détermination des valeurs de début et de fin.Il contient également le réglage de la valeur de la colonne Colonne obligatoire 1. Pour exécuter cette formule, créez simplement la Colonne obligatoire 1 et la Colonne obligatoire 2. Définissez la Colonne obligatoire 2 comme colonne de caractères.Ensuite, ouvrez la formule pour la colonne requise 2 et copiez la formule ci-dessous dans la colonne.

RCValue = "";
:Required Column 1[Row()] = .;
If( :Sensor != "Primary",
other = "Yes"
);
If( Row() == 1 | :ID != Lag( :ID ) | :"Sub-set"n != Lag( :"Sub-set"n ),
counter = 0;
withinStart = "No";
other = "Yes";
);
If(
:Sensor == "Primary" & withinStart == "Yes",
RCValue = "End";
withinStart = "No";
other = "No";,
:Sensor == "Primary" & Lag( :Sensor, -1 ) != "Primary" & withinStart == "No" & other == "Yes" & Row() !=
N Rows( Current Data Table() ),
withinStart = "Yes";
counter = counter + 1;
RCValue = "Start";
);
If( withinStart == "Yes" | RCValue == "End",
:Required Column 1[Row()] = counter
);
RCValue;