Formule conditionnelleJ'essaie d'ajouter une formule de colonne conditionnelle aux autres colonnes. J'ai des données dans lesquelles la colonne « Résultats » est empilée par « Sujet » et « Produit » avec plusieurs valeurs sur « Temps ». J'essaie de calculer la ligne de base pour chaque valeur dans « Résultats » afin que :
Nouvelle colonne = "Résultats" – [valeur "Résultats" où Temps = (1) pour cette combinaison Sujet/Produit particulière]
Merci
Automatisation et scriptsRe : Formule conditionnellePouvez-vous donner un exemple des données ?Cela aidera à trouver une solution appropriée.
Re : Formule conditionnelleSi vos données sont triées par Sujet, Produit, Heure alors cet exemple fonctionnera
Names Default To Here( 1 );
dt = Open( "$SAMPLE_DATA/big class.jmp" );
dt:age << set name( "Subject" );
dt:sex << set name( "Product" );
dt:weight << set name( "Results" );
dt << New Column( "baseline",
formula(
If( Row() == 1,
valueTime1 = :Results,
If( :Subject != Lag( :subject ) | :Product != Lag( :product ),
valueTime1 = :Results
)
);
baseline = :Results - valueTime1;
)
);Re : Formule conditionnelleJ'ai inclus des exemples de données. Je dois ajouter une nouvelle colonne dans laquelle la formule prend la valeur des résultats Temps (-5) pour chaque combinaison Sujet/Produit et soustrait cette valeur de chaque résultat de la combinaison Sujet/Produit.
Re : Formule conditionnelleParfois, il est plus facile d'attaquer des problèmes comme celui-ci en plusieurs étapes, plutôt que d'écrire du JSL complexe pour une formule de colonne. Voici une approche qui utilise "Subset" pour extraire les lignes Time=-5, les joint à la table de données d'origine avec "Update", puis effectue une simple soustraction dans une formule de colonne. Si vous utilisez JMP 17, les workflows constituent un excellent moyen de créer et de partager ce genre de choses.
Re : Formule conditionnelleLe JSL que j'ai proposé n'est pas trop compliqué.Je n'ai pas écrit de formule mais un script de table.Vous pouvez l'exécuter chaque fois que vous ajoutez plus de données.
dt = Current Data Table();
OffsetArray = Associative Array();
TimeRows = dt << Get Rows Where( :Time == -5 );
For Each( {val, idx}, TimeRows, OffsetArray[:Subject[val] || :Product[val]] = :Results[val] );
For Each Row( dt, :New Column = :Results - OffsetArray[:Subject || :Product] );modifier
Après avoir regardé davantage le tableau, j'ai remarqué les valeurs manquantes dans certaines cellules :Results.Vous devriez les recoder à 0 ou modifier un peu le script :
dt = Current Data Table();
OffsetArray = Associative Array();
TimeRows = dt << Get Rows Where( :Time == -5 );
For Each( {val, idx}, TimeRows, OffsetArray[:Subject[val] || :Product[val]] = If( !Is Missing( :Results[val] ), :Results[val], 0 ) );
For Each Row( dt, :Results with Offset = :Results - OffsetArray[:Subject || :Product] );
Re : Formule conditionnelleJuste une supposition car il n'y a pas de données pour tester cela
:Result - Col Min(If(:Time == 1, :Result, .), :Group);
Modifier:
Formule mise à jour après réception d'échantillons de données
:Results - Col Min(If(:Time == -5, :Results, .), :Subject, :Product)