Formula condizionaleSto cercando di aggiungere una formula di colonna condizionale ad altre colonne. Ho dati in cui la colonna "Risultati" è impilata per "Oggetto" e "Prodotto" con più valori su "Tempo". Sto cercando di calcolare la linea di base per ciascun valore in "Risultati" in modo che:
Nuova colonna = "Risultati" – [valore "Risultati" dove Ora=(1) per quella particolare combinazione Oggetto/Prodotto]
Grazie
Automazione e scriptingRi: Formula condizionalePuoi fornire un esempio dei dati?Ciò aiuterà a trovare una soluzione adeguata.
Ri: Formula condizionaleSe i tuoi dati sono ordinati per Oggetto, Prodotto, Orario, questo esempio funzionerà
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;
)
);Ri: Formula condizionaleHo incluso dati di esempio. Devo aggiungere una nuova colonna in cui la formula prende il valore dei risultati Time(-5) per ciascuna combinazione oggetto/prodotto e sottrae tale valore da ciascun risultato nella combinazione oggetto/prodotto.
Ri: Formula condizionaleA volte è più semplice affrontare problemi come questo in più passaggi, piuttosto che scrivere un jsl complesso per una formula di colonna. Ecco un approccio che utilizza "Sottoinsieme" per estrarre le righe Time=-5, le unisce nuovamente alla tabella dati originale con "Aggiorna" e quindi esegue una semplice sottrazione in una formula di colonna. Se utilizzi JMP 17, i flussi di lavoro sono un ottimo modo per creare e condividere questo genere di cose.
Ri: Formula condizionaleIl JSL che ho creato non è troppo complicato.Non ho scritto una formula ma uno script di tabella.Puoi eseguirlo ogni volta che aggiungi più dati.
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] );modificare
Dopo aver esaminato più attentamente la tabella, ho notato i valori mancanti in alcune celle :Results.Dovresti ricodificarli su 0 o modificare leggermente lo 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] );
Ri: Formula condizionaleÈ solo un'ipotesi poiché non ci sono dati con cui testarlo
:Result - Col Min(If(:Time == 1, :Result, .), :Group);
Modificare:
Formula aggiornata dopo aver ricevuto i dati di esempio
:Results - Col Min(If(:Time == -5, :Results, .), :Subject, :Product)