Comment créer une nouvelle colonne et insérer un texte x-rows avant un 'event' et y-rows après 'event'Salut JMP Community, Je travaille avec une table avec des milliers de lignes. Dans une colonne, certaines lignes sont marquées « événement » (par exemple, un lot hors spécifications un jour particulier). Comment puis-je créer une nouvelle colonne où les x lignes avant un 'événement' sont le marqueur PRE et les lignes y après l'événement sont marquées POST. Dans l'exemple ci-dessous x=3 et y=5.
Merci pour votre aide!

Re : Comment créer une nouvelle colonne et insérer un texte x-rows avant un "événement" et y-rows après "l'événement"Excellent, merci Jim !Re : Comment créer une nouvelle colonne et insérer un texte x-rows avant un "événement" et y-rows après "l'événement"Un petit ajustement pour votre logique supplémentaire et le JSL suivant, je crois, vous donne ce que vous voulez
If(
:Name( "Column 1 -Existing" )[Row()] == "Event", "Event",
(:Name( "Column 1 -Existing" )[Row() - 1] == "Event" |
:Name( "Column 1 -Existing" )[Row() - 2] == "Event" |
:Name( "Column 1 -Existing" )[Row() - 3] == "Event" |
:Name( "Column 1 -Existing" )[Row() - 4] == "Event" |
:Name( "Column 1 -Existing" )[Row() - 5] == "Event") &
:Name( "Column 1 -Existing" )[Row()] == "", "POST",
(:Name( "Column 1 -Existing" )[Row() + 1] == "Event" |
:Name( "Column 1 -Existing" )[Row() + 2] == "Event" |
:Name( "Column 1 -Existing" )[Row() + 3] == "Event") &
:Name( "Column 1 -Existing" )[Row()] == "", "PRE"
)
Re : Comment créer une nouvelle colonne et insérer un texte x-rows avant un "événement" et y-rows après "l'événement"Cher Jim ( @ txnelson ) ,
Merci d'avoir proposé cette solution, qui fait exactement ce que je demandais.
En jouant avec, j'ai appris que j'avais oublié un défi dans ma question initiale : lorsque les "événements" se rapprochent trop les uns des autres, les règles ci-dessous peuvent écraser les résultats précédents.
Existe-t-il un moyen d'affiner davantage votre solution en intégrant les règles de priorisation suivantes :
- 1ère priorité : Une ligne 'Evénement', toujours copiée dans la nouvelle colonne en tant que ligne 'Evénement' et ne peut pas être écrasée par 'POST' ou 'PRE' ;
- 2ème priorité : Un résultat 'POST' ne peut jamais être écrasé par un 'PRE'
Re : Comment créer une nouvelle colonne et insérer un texte x-rows avant un "événement" et y-rows après "l'événement"@pmroz , j'ai essayé d'exécuter la solution que vous proposez, mais cela crée plusieurs nouvelles tables ? (au lieu d'une nouvelle colonne, dans le tableau existant)Re : Comment créer une nouvelle colonne et insérer un texte x-rows avant un "événement" et y-rows après "l'événement"Voici une formule qui est une véritable méthode de force brute.Cela semble plus complexe qu'il ne l'est réellement, car votre choix d'avoir un signe moins "-" dans le nom de la colonne force le code à utiliser la fonction :Name() autour du nom de la colonne.
If(
:Name( "Column 1 -Existing" )[Row() + 1] == "Event" |
:Name( "Column 1 -Existing" )[Row() + 2] == "Event" |
:Name( "Column 1 -Existing" )[Row() + 3] == "Event", "PRE",
:Name( "Column 1 -Existing" )[Row() - 1] == "Event" |
:Name( "Column 1 -Existing" )[Row() - 2] == "Event" |
:Name( "Column 1 -Existing" )[Row() - 3] == "Event" |
:Name( "Column 1 -Existing" )[Row() - 4] == "Event" |
:Name( "Column 1 -Existing" )[Row() - 5] == "Event", "POST",
:Name( "Column 1 -Existing" )[Row()] == "Event", "Event"
)
Vous trouverez ci-joint votre exemple de tableau de données avec la nouvelle colonne ajoutée
Re : Comment créer une nouvelle colonne et insérer un texte x-rows avant un "événement" et y-rows après "l'événement"Cela devrait le faire:
/* Each 'PRE' should start (in this example) 3 rows before the 'Event'-row and
stop 1 row before the 'Event'
Each 'POST' should start 1 row after the event and stop 5 rows after the 'Event'
Thank you! */
dt = New Table( "pre-post example", Add Rows( 23 ),
New Column( "Column 1", Character, "Nominal",
Set Values(
{"", "", "", "", "Event", "", "", "", "", "", "", "", "", "", "", "", "",
"Event", "", "", "", "", ""}
)
),
New Column( "Column 2", Character, "Nominal",
Set Values(
{"", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "",
"", "", "", "", ""}
)
)
);
event_rows = dt << get rows where(dt:Column 1 == "Event");
nr = nrows(event_rows);
if (nr > 0,
for (i = 1, i <= nr, i++,
start_row = maximum(event_rows[i] - 3, 1); // Keep from trying to set a negative row
for (k = start_row, k < event_rows[i] , k++,
dt:column 2[k] = "PRE";
);
end_row = minimum(event_rows[i] + 5, nrows(dt)); // Prevent setting higher rows than are in the table
for (k = event_rows[i] + 1, k <= end_row, k++,
dt:column 2[k] = "POST";
);
dt:column 2[event_rows[i]] = "Event";
);
);Re : Comment créer une nouvelle colonne et insérer un texte x-rows avant un "événement" et y-rows après "l'événement"@pmroz Veuillez trouver ci-joint un bref exemple.
Chaque 'PRE' doit commencer (dans cet exemple) 3 lignes avant la ligne 'Event' et s'arrêter 1 ligne avant 'Event'
Chaque 'POST' doit commencer 1 ligne après l'événement et s'arrêter 5 lignes après l''Event'
Merci!
Re : Comment créer une nouvelle colonne et insérer un texte x-rows avant un "événement" et y-rows après "l'événement"Il n'est pas clair d'après votre exemple quand le prochain "PRE" devrait commencer.Pouvez-vous fournir un petit exemple de jeu de données ?