Crea formula: media di Col A per le righe in cui Col B è minimo nel gruppo Col C?Supponiamo che stessi utilizzando il set di dati Big Class e volessi creare una nuova colonna per il peso medio dello studente più basso della stessa età: come posso impostarlo?
So come fare la prima parte (trovare l'altezza dello studente più basso della stessa età), che è solo un Col Mean con una byVariable:
Col Minimo( :altezza, :età )
Ma quello che non so come fare è prendere il peso medio di quel sottoinsieme di studenti dove (A) l'età di quello studente corrisponde all'età dello studente in questa riga e (B) l'altezza di quello studente corrisponde all'altezza più bassa per gli studenti della loro età.
Combinazione e pulizia dei datiRi: Crea formula: media di Col A per le righe in cui Col B è minimo nel gruppo Col C?Fantastico, grazie! Impari due cose nuove ogni giorno 
Per combinare le formule di Cars in una colonna, il risultato sarà questo:
:Size[Col Max( If( :Wt == Col Max( :Wt, :Make ), Row(), . ), :Make )]
Ri: Crea formula: media di Col A per le righe in cui Col B è minimo nel gruppo Col C?Ho allegato una tabella dati con formule leggermente diverse e suddivisa in più di una (le mie precedenti per Auto potrebbero aver avuto alcuni problemi dovuti al raggruppamento per pesi non massimi). Questo ti permetterà anche di vedere cosa succede se ci sono pareggi.
:Size[idx] ti consente di accedere al valore nella colonna :Size con l'idx specificato, puoi anche accedere a più valori con :Size[[1,2,3]] ad esempio (questo potrebbe aiutare un po' Sottoscrizione della tabella dati )
Eseguilo nella finestra dello script, dai un'occhiata al registro e confrontalo con datatable:
Names Default To Here(1);
dt = Open("$SAMPLE_DATA/Big Class.jmp");
Show(dt:name[1]);
Show(dt:name[5]);
Show(dt:name[10]);
Show(dt:name[[10, 11]]);
Show(dt:name[10::15]);Ri: Crea formula: media di Col A per le righe in cui Col B è minimo nel gruppo Col C?Grazie @jthi , funziona magnificamente!
Per essere sicuro di aver capito, sembra che l'istruzione If stia creando una colonna "virtuale" che annulla qualsiasi riga in cui l'altezza non è l'altezza minima per quell'età, e quindi utilizza Col Mean per operare su quella colonna "virtuale". Bel trucco!
Non mi sembra che la formula per l'esempio delle automobili funzioni: ad esempio, la formula restituisce "pu" per Chevrolet anche se la Chevy più pesante (la Suburban) è "mpv" e restituisce "med" per Chrysler anche se la Chrysler più pesante (la Fifth Avenue) è "hev". Ad ogni modo, per la mia applicazione hai già risolto il problema con la tua formula di Big Class, ma, solo per curiosità e per approfondire il mio JMP-fu, sono curioso di saperne di più su cosa succede nella formula finale. Cosa fa l'operatore parentesi, ad esempio ":Size[...]"?
Ri: Crea formula: media di Col A per le righe in cui Col B è minimo nel gruppo Col C?Puoi farlo con una formula (ottenendo la media dei pesi minimi per fascia di età):
Col Mean(If(:height == Col Min(:height, :age), :weight, .), :age)
Dividi la formula in due formule diverse per renderla un po' più facile da capire:
Valori di peso minimo:
If(:height == Col Min(:height, :age),
:weight,
.
)
e quindi media di quel valore:
Col Mean(:MinWeightVal, :age)
Col Mean ignorerà i valori mancanti, quindi dovrebbe funzionare
Con le auto (non sono esattamente sicuro di come vuoi che appaiano i dati:
Peso massimo per marca:
Col Max(:Wt, :Make)
Taglia per peso se vuoi che abbia una sola riga:
If(:Wt == :Max Wt for Make,:Size,"")
Stesso valore per più righe, molto probabilmente puoi eliminare alcune funzioni Col da lì, ma questa è stata la più semplice che mi è venuta in mente rapidamente:
:Size[Col Max(Col Max(Row(), If(:Wt == Col Max(:Wt, :Make), 1, 0), :Make), :Make)]
sputare in più formule diverse per vedere come funziona
Ri: Crea formula: media di Col A per le righe in cui Col B è minimo nel gruppo Col C?CIAO @markschwab ,
se puoi permetterti di ordinare la tabella, prova questo:
Names default to here (1);
// Open Data Table: Cars.jmp
dt = Open( "$SAMPLE_DATA/Cars.jmp" );
// Sort data table
dt << Sort( By( :Make, :Wt ), Replace Table, Order( Ascending, Descending ) );
// New column: Size of Max Wt for Make<BR />dt << New Column( "Size of Max Wt for Make",<BR />Character,<BR />"Nominal",<BR />Formula( If( Row() == 1, :Size, :Make == Lag( :Make ), Lag( :Size of Max Wt for Make ), :Make != Lag( :Make ), :Size ) )<BR />);<BR />
a questo punto vorrei conoscere anche la soluzione con formula diretta senza ordinamento.
se è necessario ricorrere ai dati in un secondo momento, è sufficiente rimuovere la formula o sopprimere la valutazione.
Ri: Crea formula: media di Col A per le righe in cui Col B è minimo nel gruppo Col C?Grazie Ron. Penso che potrebbe funzionare per me (anche se sarebbe bello poterlo fare all'interno della stessa scheda tecnica).
Per renderlo più semplice, si spera, andrebbe bene per la mia applicazione reale utilizzare una ricerca invece di una media: la colonna di cui prenderò il massimo è un timestamp e possiamo supporre che ci sia una riga univoca per ciascun gruppo con il timestamp più recente.
Quindi, ad esempio, utilizzando il set di dati Cars, il mio problema sarebbe:
Crea una colonna "Dimensione del peso massimo per marca" che trovi l'auto con il peso massimo tra tutte le auto con la stessa marca, quindi cerca la dimensione di quell'auto con peso massimo.
Ri: Crea formula: media di Col A per le righe in cui Col B è minimo nel gruppo Col C?CIAO @markschwab ,
finché qualcuno non ci mostra il modo elegante di utilizzare una formula di colonna, puoi provare quanto segue:
names default to here (1);
// Open Data Table: Big Class.jmp
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
// New column: min height 0/1
dt<< New Column( "min height",
Numeric,
"Continuous",
Format( "Best", 12 ),
Formula( If( :height == Col Min( :height, :age ), 1 ) )
);
// Data table summary
// → Data Table( "Big Class By (age, Min height)" )
dt2 = dt << Summary(
Group( :age, :Min height ),
Mean( :weight ),
Freq( "None" ),
Weight( "None" ),
Link to original data table( 0 )
);
// Delete selected rows
dt2 <<
Select Where( Is Missing( :Min height ) ) << Delete Rows;
// Update data tables
dt << Update(
With( dt2 ),
Match Columns( :age = :age ),
Replace Columns in Main Table(:"Mean(weight)"n )
);
una formula sarebbe più carina poiché si aggiornerà automaticamente.
facci sapere se aiuta.
Ron