Comment définir une nouvelle colonne basée sur la condition de n lignes consécutivesSalut tout le monde,
Je recherche une colonne de formule où ses éléments dépendent des au moins 10 lignes consécutives d'une autre colonne remplissant une valeur seuil. Veuillez consulter l'image et les données ci-jointes. Ceux-ci incluent également la colonne requise "Corriger la région défaillante".
Toute aide s'il vous plaît.
Merci, HSS

ScriptRe : Comment définir une nouvelle colonne basée sur la condition de n lignes consécutivesJe diviserais peut-être l'algorithme en trois parties :
- Augmentez le compteur lorsqu'il y a suffisamment de valeurs supérieures à 750 (définissez éventuellement une ou plusieurs variables de support)
- Augmenter le compteur lorsqu'il y a même une valeur inférieure à 750 APRÈS et ne le faire qu'UNE FOIS pour chaque étape 1. augmenter (éventuellement définir une ou plusieurs variables de support)
- N'augmentez pas le compteur (définissez éventuellement une ou plusieurs variables de support)
cela pourrait être plus facile (peut-être pas plus facile, mais plus clair) à faire avec quelques variables de support supplémentaires.
Peut-être quelque chose comme ça :
If(Row() == 1,
counter = 1;
allow_over_limit_change = 1;
allow_below_limit_change = 0;
);
current_vals_to_check = :Current[Row()::Min(Dim()[1], Row() + 9)];
over_limit_count = Sum(current_vals_to_check >= 750);
If(allow_over_limit_change & over_limit_count >= 10,
counter++;
allow_below_limit_change = 1;
allow_over_limit_change = 0;
, allow_below_limit_change & :Current < 750,
counter++;
allow_below_limit_change = 0;
allow_over_limit_change = 1;
);
counter;
Row() == 1 si l'instruction peut très probablement être remplacée par ceci (à mon avis, pas aussi clair que l'utilisation de l'instruction If)
As Constant(counter = 1);
As Constant(allow_over_limit_change = 1);
As Constant(allow_below_limit_change = 0);
Re : Comment définir une nouvelle colonne basée sur la condition de n lignes consécutivesBonjour @jthi ,
J'ai essayé quelque chose sur ma nouvelle exigence. Ce n'est peut-être pas la meilleure solution, mais c'est un contournement. Et c'est très proche de la solution que vous avez suggérée pour le problème d'origine. Jusqu'à présent, cela fonctionne bien.
If( Row() == 1, val = 1 );
Next_10_values = Sum( :Current[Index( Row(), Min( Dim()[1], Row() + 9 ) )] >= 750 );
Previous_10_values = Sum( :Current[Index( Row(), Min( Dim()[1], Row() - 9 ) )] >= 750 );
If(
Next_10_values == 10 & Lag( :Current ) < 750 | Previous_10_values == 9 & :Current < 750 &
Lag( :Current ) >= 750,
val = val + 1
);
val;
Merci beaucoup pour votre soutien.
Cordialement, HSS
Re : Comment définir une nouvelle colonne basée sur la condition de n lignes consécutivesLe changement est utilisé pour augmenter la valeur si nécessaire. Pour le troisième problème, cela nécessiterait une réécriture de l'algorithme car les conditions ont changé
Re : Comment définir une nouvelle colonne basée sur la condition de n lignes consécutives@jthi Merci pour l'explication.
Je l'exécute ligne par ligne et j'en ai obtenu pas mal.
Je n'ai toujours aucune idée de pourquoi avons-nous la variable 'change' dans le script et quel est son but ? Il prend simplement deux valeurs, soit 1 (comme valeur définie) et 0 chaque fois que nous obtenons plus de 10 entrées consécutives avec une valeur actuelle satisfaisante. Mais il n'apparaît nulle part dans l'indexation des nouvelles colonnes. Mais si je l'exécute sans la variable 'Change', je n'obtiens pas les entrées correctes. Mais je ne suis pas en mesure de comprendre comment et où cela a un impact sur notre calcul/indexation.
et 3ème partie du problème - comment puis-je augmenter l'index courant lorsque la région souhaitée de :current>=750 se termine ?
merci, HSS
Re : Comment définir une nouvelle colonne basée sur la condition de n lignes consécutivesCe que je suggérerais de faire, c'est de modifier le script en quelque chose comme ça qui vous permettra de l'exécuter "ligne par ligne":
// Names Default To Here(1);
// Clear Log();
dt = Current Data Table();
run_script = Expr(
If(Row() == 1,
val = 1; // this is breaking rule of > 750, so we define it separately
change = 1;
);
next_vals = :Current[Row()::Min(Dim()[1], Row() + 9)];
over_limit = Sum(next_vals >= 750);
If(change & over_limit >= 10,
val++;
change = 0;
, over_limit < 10,
change = 1;
);
val;
show(row(), val, change, next_vals, over_limit);
Write("\!N");
);
Row() = 1;
run_script;
Row() = 2;
run_script;
Row() = 5;
run_script;
Ensuite, vous pouvez assez facilement exécuter le script en plusieurs parties et consulter le journal pour voir ce qui se passe (vous pouvez également exécuter une ligne à la fois si vous le souhaitez).
Fenêtre de script et journal intégré :

Scripting Index est également utile pour expliquer les fonctions, telles que Dim().
Si cela ne suffit pas, veuillez commenter dans ce post et me taguer, je peux essayer de l'expliquer plus en détail.
Re : Comment définir une nouvelle colonne basée sur la condition de n lignes consécutivesIl y a une erreur dans l'image jointe au message précédent. Veuillez ignorer le dernier rectangle rouge, car par erreur, j'ai également changé le compteur pour l'ancienne exigence. Cela ne devrait pas être le cas.
merci, HSS
Re : Comment définir une nouvelle colonne basée sur la condition de n lignes consécutivesSalut Jarmo et tous,
Ce code fonctionne bien et je suis capable de l'implémenter parfaitement dans le script.
Mais d'un autre côté, je n'arrive pas à comprendre. Je veux le modifier un peu mais je n'y arrive pas. Pourriez-vous s'il vous plaît m'aider dans ce -
1. Que fait cette déclaration -
next_vals = :Current[Row()::Min(Dim()[1], Row() + 9)];
2. Je ne suis pas en mesure de comprendre où se situe l'augmentation du « changement » et comment cette condition peut-elle être satisfaite ?
If(change & over_limit >= 10,
Je crois que c'est la même chose que - "If( change >=10 & over_limit >=10
3. Dans mon problème actuel, je voudrais augmenter le compteur d'un une fois que la région souhaitée est terminée (avec un minimum de 10 entrées) - quelque chose comme ça -

De l'aide ?
merci, HSS
Re : Comment définir une nouvelle colonne basée sur la condition de n lignes consécutivesMerci Jarmo,
Cela fonctionne parfaitement. Maintenant, je dois intégrer cela dans mon script. J'espère que je peux le faire.
merci, HSS
Re : Comment définir une nouvelle colonne basée sur la condition de n lignes consécutivesAbonnement aux tables de données est une option.
J'ai changé le nom de la colonne actuelle :
Names Default To Here(1);
dt = Current Data Table();
dt << New Column("a", Numeric, Ordinal,
<< Set Each Value(
If(Row() == 1,
val = 1; // this is breaking rule of > 750, so we define it separately
change = 1;
);
next_vals = :Current[Row()::Min(Dim()[1], Row() + 9)];
over_limit = Sum(next_vals >= 750);
If(change & over_limit >= 10,
val++;
change = 0;
, over_limit < 10,
change = 1;
);
val;
)
);