Bedingte FormelIch versuche, eine Spaltenformel hinzuzufügen, die von anderen Spalten abhängig ist. Ich habe Daten, in denen die Spalte „Ergebnisse“ nach „Betreff“ und „Produkt“ mit mehreren Werten über „Zeit“ gestapelt ist. Ich versuche, die Basislinie für jeden Wert in „Ergebnisse“ zu berechnen, sodass:
Neue Spalte = „Ergebnisse“ – [Wert „Ergebnisse“, wobei Zeit=(1) für diese bestimmte Kombination aus Betreff und Produkt]
Danke
Automatisierung und SkripterstellungBetreff: BedingungsformelKönnen Sie ein Beispiel für die Daten nennen?Das hilft bei der Suche nach einer geeigneten Lösung.
Betreff: BedingungsformelWenn Ihre Daten nach Betreff, Produkt und Zeit sortiert sind, funktioniert dieses Beispiel
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;
)
);Betreff: BedingungsformelIch habe Beispieldaten beigefügt. Ich muss eine neue Spalte hinzufügen, in der die Formel den Zeit(-5)-Ergebniswert für jede Betreff-/Produktkombination nimmt und diesen Wert von jedem Ergebnis in der Betreff-/Produktkombination subtrahiert.
Betreff: BedingungsformelManchmal ist es einfacher, solche Probleme in mehreren Schritten anzugehen, als komplexe JSL für eine Spaltenformel zu schreiben. Hier ist ein Ansatz, der „Subset“ verwendet, um die Time=-5-Zeilen zu extrahieren, sie mit „Update“ wieder mit der ursprünglichen Datentabelle zusammenfügt und dann eine einfache Subtraktion in einer Spaltenformel durchführt. Wenn Sie JMP 17 verwenden, sind Workflows eine großartige Möglichkeit, solche Dinge zu erstellen und zu teilen.
Betreff: BedingungsformelDie JSL, die ich mir ausgedacht habe, ist nicht allzu kompliziert.Ich habe keine Formel geschrieben, sondern ein Tabellenskript.Sie können dies immer dann ausführen, wenn Sie weitere Daten hinzufügen.
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] );bearbeiten
Nachdem ich mir die Tabelle genauer angesehen hatte, fielen mir die fehlenden Werte in einigen :Results-Zellen auf.Sie sollten diese auf 0 umcodieren oder das Skript etwas ändern:
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] );
Betreff: BedingungsformelNur eine Vermutung, da es keine Daten gibt, mit denen man dies testen könnte
:Result - Col Min(If(:Time == 1, :Result, .), :Group);
Bearbeiten:
Aktualisierte Formel, nachdem wir Beispieldaten erhalten haben
:Results - Col Min(If(:Time == -5, :Results, .), :Subject, :Product)