Come utilizzo la formula Col Maximum con una condizione "where".Ciao, ho un problema in cui voglio formulare una nuova colonna come punto di riferimento per tutti gli altri paesi. Se ci sono più righe per il paese, voglio prenderne il valore massimo come punto di riferimento. Vedere l'esempio seguente per chiarimenti.
Il tipo di dati assomiglia a questo:
Paese Valore periodo
A 10 201301
A 30 201301
B 20 201301
C 50 201301
D 40 201301
Cosa voglio ottenere (con la formula della cella): Col Maximum (:value, :period, :country) dove :paese == "A"
Produzione:
Paese Valore periodo BenchMark
A 10 201301 30
A 30 201301 30
B 20 201301 30
C 50 201301 30
D 40 201301 30
Come puoi vedere, voglio confrontare il valore massimo del solo paese A.
Ho provato Col Maximum (:value, :period, :country == "A") e restituirà "50"
Col Maximum (:value, :period, :country) e Col Maximum (:value, :period, :country == "A") restituiscono entrambi "50"
Sono abbastanza sicuro che ci sia una soluzione semplice per questo!
Spero che possiate aiutare!
Grazie grazie!
Re: Come utilizzo la formula Col Maximum con una condizione "where".Grazie.Re: Come utilizzo la formula Col Maximum con una condizione "where".Col Maximum() è praticabile solo in una formula, dove un risultato di separazione per riga è l'output.Per fare quello che vuoi, usa la funzione Summarize().
Vedere:
Aiuto==>Indice scripting==>Riassumi
Re: Come utilizzo la formula Col Maximum con una condizione "where".Ciao Mark,
ha cercato di ottenere il peso massimo in base all'età o al sesso, ma produce solo un valore nello script seguente.
per età, c'erano 6 età diverse, per ognuna di esse, vorrei calcolare il peso massimo per ogni età.
Names Default To Here( 1 );
Clear Log();
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
max_weight_by_age = Col Max( :weight, :age );
max_weight_by_sex = Col Max( :weight, :sex );
Re: Come utilizzo la formula Col Maximum con una condizione "where".Potrei aggiungere questa formula a una nuova colonna nella tabella dei dati di esempio di Big Class:
Col Max( :weight, :age )
Re: Come utilizzo la formula Col Maximum con una condizione "where".Ciao Mark,
Puoi fare un esempio su come usare quando usi col Max?
Grazie.Re: Come utilizzo la formula Col Maximum con una condizione "where".Vedere Guida > Indice script > Funzioni:

Re: Come utilizzo la formula Col Maximum con una condizione "where".Grazie Jim, intendevo solo riassumere. Come lo faccio è (due comandi jsl):
Riepiloga sulla colonna, crea una nuova tabella con i valori (min/max/o qualsiasi altra statistica per la colonna).
Quindi aggiorno la tabella principale utilizzando la tabella riassuntiva abbinando le voci di riga.
Ero solo curioso di sapere se esiste un'opzione condizionale nel comando Max col() che può identificare valori di colonna univoci ed eliminare la necessità di questo passaggio aggiuntivo. (eliminerebbe un tavolo in più e 2 passaggi in più).
Apprezzo il tuo aiuto.
Re: Come utilizzo la formula Col Maximum con una condizione "where".In genere utilizzo la funzione Summarize(), piuttosto che la piattaforma di riepilogo, per determinare facilmente quali livelli vengono trovati all'interno di una colonna.Quindi, da lì, devi solo generare la formula di cui hai bisogno per portare a termine il lavoro.
Re: Come utilizzo la formula Col Maximum con una condizione "where".Supponiamo che la colonna del paese abbia diversi nomi e io non conosca tutti i possibili valori. Come può questa query essere ottimizzata per farlo.
Posso farlo creando una tabella di riepilogo e quindi aggiornando la tabella, ma sembra essere un metodo inefficace, era curioso se si potesse fare in un unico passaggio come questo.
Grazie in anticipo.
Re: Come utilizzo la formula Col Maximum con una condizione "where".Scusa per il ritardo della risposta! Grazie per la soluzione!Re: Come utilizzo la formula Col Maximum con una condizione "where".Dato il modo in cui hai dichiarato le tue esigenze, supponendo che tu sappia qual è il paese che ha le voci multiple.
dt = Current Data Table();
rowperiod = :Period[Row()];
Max(
:Value[dt << get rows where(
:Country == "A" & :period == rowperiod
)]
);
Re: Come utilizzo la formula Col Maximum con una condizione "where".
@hogi ha scritto:C'è un comando a una riga rimuovere la femmina dal calcolo della media, ma scrivere i valori nelle rispettive righe con "femmina"?
Voglio dire, qualcosa del tipo:
Col Mean( :weight, :age, where( :sex == "M" ) )
?
Re: Come utilizzo la formula Col Maximum con una condizione "where".Applica un If() alla colonna :weight nell'equazione

col Mean( if(:sex=="M", :weight,.), :age)
Re: Come utilizzo la formula Col Maximum con una condizione "where".Fantastico!
E quindi logica - quando lo vedi!
Sono molto deluso da me stesso per non aver trovato questa soluzione da solo.
Re: Come si usa la formula Col Maximum con una condizione "where"Mmm, dopo un po' di entusiasmo, mi sono un po' arenato.
Sembra che l' if all'interno dell'aggregazione Col lo renda molto lento, specialmente se c'è un confronto di caratteri all'interno dell'if, e specialmente x 2 se c'è una conversione char(num). Quindi il tempo scala ~ quadratico con l'aumento delle dimensioni della tabella.
La cosa positiva: Col Median (che uso la maggior parte delle volte) non è interessato da questo "bug":)
Esiste una soluzione semplice per Col Min, max, mean ...?
In caso contrario, scriverò un messaggio per implementare un metodo ufficiale per calcolare Col xyz con una condizione where ...
Sarebbe molto più veloce se il set di dati fosse prima ridotto ( dove ) e poi aggregato ( Col xyz ) e poi i valori distribuiti su tutte le rispettive righe.

Vedi altro...Names Default To Here( 1 );
If( Is Empty( mydt ),
mydt = Open( "$SAMPLE_DATA/Big Class.jmp" )
);
trialRun = 0;
tryAgain = Function( {},
trialRun += 1;
Rownumbers = N Rows( mydt );
t1 = HP Time();
mydt << New Column( "col A", Formula( Col Mean( :weight ), :sex ) );
t2 = HP Time();
mydt << New Column( "col B", Formula( Col Mean( If( :age == 12, :weight, . ), :sex ) ) );
t3 = HP Time();
mydt << New Column( "col C", Formula( Col Mean( If( :sex == "M", :weight, . ), :age ) ) );
t4 = HP Time();
mydt << New Column( "col D", Formula( Col Mean( If( Char( :age ) == "12", :weight, . ), :age ) ) );
t5 = HP Time();
mydt << New Column( "col E", Formula( Char( :age ) == "12" ) );
t6 = HP Time();
tt1 = Round( (t2 - t1) / 1000000, 4 );
tt2 = Round( (t3 - t2) / 1000000, 4 );
tt3 = Round( (t4 - t3) / 1000000, 4 );
tt4 = Round( (t5 - t4) / 1000000, 4 );
tt5 = Round( (t6 - t5) / 1000000, 6 );
If( trialRun == 1,
tt1Ref = tt1;
tt2Ref = tt2;
tt3Ref = tt3;
tt4Ref = tt4;
tt5Ref = tt5;
RNref = Rownumbers;
);
tr1 = Round( tt1 / tt1Ref );
tr2 = Round( tt2 / tt2Ref );
tr3 = Round( tt3 / tt3Ref );
tr4 = Round( tt4 / tt4Ref );
tr5 = Round( tt5 / tt5Ref );
RNratio = Round( RowNumbers / RNref );
Wait( 0.1 );
Try( mydt << delete columns( "col A", "col B", "col C", "col D", "col E" ) );
Wait( 0.1 );
mydt = mydt << Concatenate( mydt, mydt, mydt );
Wait( 0.1 );
If(
ex = New Window( "results",
<<TYPE></TYPE></CODE><NOSCRIPT><CODE class=" language-jsl"><DIV class="lia-spoiler-noscript-container"><DIV class="lia-spoiler-noscript-content">I nomi predefiniti sono qui (1); Se (è vuoto (mydt), mydt = Open ("$SAMPLE_DATA/Big Class.jmp" ) ); trialRun = 0; tryAgain = Function( {}, trialRun += 1; Rownumbers = N Rows( mydt ); t1 = HP Time(); mydt << Nuova colonna( "col A", Formula( Col Mean( :weight ), :sex ) ); t2 = HP Time(); mydt << Nuova colonna( "col B", Formula( Col Mean( If( :age == 12, :weight, . ), :sex ) ) ); t3 = HP Time(); mydt << Nuova colonna( "col C", Formula( Col Mean( If( :sex == "M", :weight, . ), :age ) ) ); t4 = HP Time(); mydt << Nuova colonna( "col D", Formula( Col Mean( If( Char( :age ) == "12", :weight, . ), :age ) ) ); t5 = HP Time(); mydt << Nuova colonna( "col E", Formula( Char( :age ) == "12" ) ); t6 = HP Time(); tt1 = Round( (t2 - t1) / 1000000, 4 ); tt2 = Round( (t3 - t2) / 1000000, 4 ); tt3 = Round( (t4 - t3) / 1000000, 4 ); tt4 = Round( (t5 - t4) / 1000000, 4 ); tt5 = Round( (t6 - t5) / 1000000, 6 ); If( trialRun == 1, tt1Ref = tt1; tt2Ref = tt2; tt3Ref = tt3; tt4Ref = tt4; tt5Ref = tt5; RNref = Rownumbers; ); tr1 = Round( tt1 / tt1Ref ); tr2 = Round( tt2 / tt2Ref ); tr3 = Round( tt3 / tt3Ref ); tr4 = Round( tt4 / tt4Ref ); tr5 = Round( tt5 / tt5Ref ); RNratio = Round( RowNumbers / RNref ); Wait( 0.1 ); Try( mydt << delete columns( "col A", "col B", "col C", "col D", "col E" ) ); Wait( 0.1 ); mydt = mydt << Concatenate( mydt, mydt, mydt ); Wait( 0.1 ); If( ex = New Window( "results", < <TYPE></TYPE></DIV></DIV>
In a previous version I had "ms" in the table instead of seconds. Unfortunately, it's 1000x more severe ...
Re: Come utilizzo la formula Col Maximum con una condizione "where".Domanda interessante: davanzale in attesa di una risposta?
C'è una serie di post con domande simili su come limitare il Col... aggregazione funzioni a uno specifico sottoinsieme.
(principalmente: limitarli al sottoinsieme di righe non escluse)
Calcola la media della colonna limitando le osservazioni utilizzate
JMP10: le funzioni Col Max() e Col Min() hanno restituito i dati dalla riga esclusa
Funzioni Col e stati di riga
L'idea:
Se si è interessati all'altezza media, si possono aggregare su tutte le righe, oppure si possono aggregare separatamente le voci maschili e femminili.
Per il secondo la soluzione è quasi semplice come per il primo: basta utilizzare una variabile GroupBy aggiuntiva per suddividere tra dati desiderati e dati indesiderati.
Ma ciò di cui un utente ha spesso bisogno in aggiunta: i valori dovrebbero apparire in tutte le rispettive righe (cioè anche per le donne).
[L'esempio con la colonna di riferimento nel post originale illustra perché un simile comportamento potrebbe avere senso.]
Con GroupBy è facile ottenere i valori corretti, ma come distribuirli su TUTTE le righe.
Se c'è qualcosa come una tabella di ricerca dietro a Col... aggregazione funzione, la funzione utilizza lo stesso identificatore
1) per dividere le righe in diversi gruppi per l'aggregazione ("M" / "F"):
Judy è una donna, il peso nella fila di Judy dovrebbe essere incluso peso medio femminile
2) come indice durante la lettura di una voce dalla tabella di ricerca ("M" / "F"):
Judy è una donna, la nuova colonna dovrebbe contenere peso medio femminile nella fila di Judy
Quindi, maschio e femmina ottengono gli stessi valori, perché l'identificatore è lo stesso (mean1) - oppure ottengono valori diversi perché l'identificatore è diverso (mean2).
quindi:
Un utente Jmp Potere utilizzare la funzione GroupBy per rimuovere i valori dal calcolo tramite:
- calcolare valori diversi per sottogruppi diversi
- scaricare i risultati indesiderati
ma poi ottiene
- Ottenere valori diversi per sottogruppi diversi
gratuitamente - anche se non ha ordinato questa opzione (OK, il codice racconta un'altra storia - ma pensiamo a cosa voleva l'utente) 
C'è un comando a una riga rimuovere la femmina dal calcolo della media, ma scrivere i valori nelle rispettive righe con "femmina"?
Names Default to Here(1);
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
dt << New Column("mean1", Formula(Col Mean(:weight, :age)));
dt << New Column("mean2", Formula(Col Mean(:weight, :age, :sex)));
dt << New Column("mean2", Formula(If(:sex=="M", Col Mean(:weight, :age, :sex))));
dtM = dt << subset( Rows( dt << get rows where( :sex== "M" ) ), selected columns( 0 ));
dtM << New Column("mean_M", Formula(Col Mean(:weight, :age)));
dt << Update(
With( dtM ),
Match Columns(:age = :age ),
Add Columns from Update Table( :mean_M ),
Replace Columns in Main Table( None )
);
Re: Come utilizzo la formula Col Maximum con una condizione "where".Un approccio per velocizzare le cose ordini di grandezza (!!!):
Invece del lentissimo Col Mean con il confronto dei caratteri all'interno dell'istruzione if :
mydt << New Column( "col C", Formula( Col Mean( If( :name=="Robert", :weight, . ), :age ) ) );
utilizzo @cwillden Il trucco di: usa il confronto come argomento GroupBy:
Risolto: Re: Ottieni righe che soddisfano una condizione all'interno di una formula di colonna - Comunità utenti JMP
mydt << New Column( "col C", Formula(if(:name=="Robert" , Col Mean( :weight, :age, :name=="Robert" ),. ) );
per dividere i dati in 2 gruppi: dati desiderati e indesiderati (schermata sotto con @10k righe -> Factor 2000 più veloce 
.. e quindi rimuovere i risultati indesiderati tramite l'istruzione if al di fuori dell'aggregazione Col Mean.
Con il confronto per la colonna :sesso questo approccio sarebbe eccessivamente ingegnerizzato; per questo sono passato al :nome confronto per illustrare il concetto.
Anche questo è un po 'troppo ingegnerizzato, ma spero che l'idea sia chiara 

Visualizza altro...
Re: Come utilizzo la formula Col Maximum con una condizione "where".Ho appena notato:
- il trucco non funziona per
:name=="Roberto"
sembra essere un caso speciale: il confronto viene semplicemente ignorato (in Jmp 16 e 17.1).
strano ...
- Con tutto l'entusiasmo per le nuove possibilità (utilizzando le condizioni (!) come GroupBy) e per il miglioramento della velocità, mi mancava completamente il fatto di tornare più o meno al punto di partenza: aggregazione di colonne con le opzioni Group By.
Quindi, non ho raggiunto il mio vero obiettivo: riempire "le altre" righe con valori, come spiegato qui:
Come-uso-la-formula-Col-Maximum-con-quot-where-quot/mp/571889/highlight/true#M78145
Ma c'è una soluzione alternativa: invece di un file slow
New Column( "newcol", Formula(Col Mean( if(:sex=="M",:weight,.), :age ) ));
fare attenzione che ci siano solo opzioni Group By all'interno di Slow Col Mean
... quindi usa il veloce Col Median per diffondere i valori alle altre righe:
New Column( "newcol", Formula(Col Median(If(:sex =="M" ,Col Mean( :weight, :age, :sex),.),:age) ));
Inoltre: l'argomento ha attirato l'attenzione del team di sviluppo di Jmp:
Col Mediano (e altri): aggiunta l'opzione "Dove".
@SamGardner ha scritto:
Stato cambiato in: Ci piace! (in coda)... lavoriamo su modi per migliorare il modo in cui le clausole Where() vengono utilizzate in JMP.
Sembra che presto ci sarà una soluzione molto più semplice per il problema 
Re: Come si usa la formula Col Maximum con una condizione "where"Curiosità:
la ricerca di "M" in un elenco di stringhe è di ordini di grandezza più veloce rispetto al confronto di "M" con una stringa:

Names Default To Here( 1 );
If( Is Empty( mydt ),
mydt = Open( "$SAMPLE_DATA/Big Class.jmp" )
);
tryAgain = Function( {},
write ("\!nrows: ", nrows(mydt),"\!n");
t0 = HP Time();
mydt << New Column( "char=char", Formula( Col Mean( If( :sex == "M", :weight, . ), :age ) ) );
t=(HP Time()- t0)/1000000;
write("char=char: ",t,"\!n");
t0 = HP Time();
mydt << New Column( "contains", Formula( Col Mean( If( contains(Eval List({:sex[]}) ,"M"), :weight, . ), :age ) ) );
t=(HP Time()- t0)/1000000;
write("contains: ",t,"\!n");
If(
ex = New Window( "",
<<TYPE></TYPE><BR />why?!?<BR />Which secret is behind this finding?
Re: Come si usa la formula Col Maximum con una condizione "where"?2025 - JMP19 apporta un significativo miglioramento della velocità nei confronti delle stringhe.
Freddo!
Oltre a ciò, il suggerito
col Mean(:weight, :age, where(not(excluded())))
è stato introdotto per le colonne di trasformazione nei report. È diventato compatto come:

D'altro canto, è ancora molto difficile ottenere la formula giusta per un'aggregazione limitata a, ad esempio , :sex="M" :
<SPAN class="token function">if<SPAN class="token punctuation">(</SPAN><SPAN class="token punctuation">:</SPAN>sex<SPAN class="token operator">==</SPAN><SPAN class="token string">"M"& not(excluded()),<BR /></SPAN> col Max</SPAN><SPAN class="token punctuation">(</SPAN><SPAN> </SPAN><SPAN class="token function">if</SPAN><SPAN class="token punctuation">(</SPAN><SPAN class="token punctuation">:</SPAN>sex<SPAN class="token operator">==</SPAN><SPAN class="token string">"M"</SPAN><SPAN class="token punctuation">,</SPAN><SPAN> </SPAN><SPAN class="token punctuation">:</SPAN>weight<SPAN class="token punctuation">,</SPAN><SPAN class="token punctuation">.</SPAN><SPAN class="token punctuation">)</SPAN><SPAN class="token punctuation">,</SPAN><SPAN> </SPAN><SPAN class="token punctuation">:</SPAN>age, excluded()<SPAN class="token punctuation">)<BR /> , .<BR />);</SPAN>
Qualcosa del genere
col Max(:weight, :age, @excluded, where(:sex=="M"))
potrebbe aiutare molto.
Hm: Col Median (e altri): aggiungi l'opzione "Dove" : 1 Kudo in 3,5 anni?! Strano.