Conta il numero di elementi unici nella colonna che soddisfano determinati criteriSupponiamo che nella tabella "Classe numerosa" io voglia una formula che conti il numero di nomi unici di persone la cui altezza è pari o inferiore a quella della persona nella riga corrente. Come posso fare?
Ho questo:
thisHeight = :height;
Col N Unico( :nome, :altezza <= questaaltezza );
Mi rendo conto che il secondo parametro è quello di raggruppamento, ed è più intuitivo cercare di limitare ciò che viene passato al primo parametro, ma finora non ho avuto fortuna con nessuno dei tentativi che ho fatto.
Accesso ai datiOggetto: Conteggio del numero di elementi unici nella colonna che soddisfano alcuni criteriLa funzione integrata più vicina che mi viene in mente è Col Rank( :altezza, < Il problema è: questo conta il numero totale di righe a partire da thisHeight, non il numero di nomi univoci .
In alternativa, potresti provare una formula personalizzata, come questa:
thisHeight = :height; //store the current height value
// Build an associative array to collect unique names at or below thisHeight
aa = Associative Array();
For( i = 1, i <= N Rows(), i++,
If( Column("height")[i] <= thisHeight,
aa[Column("name")[i]] = 1 // This only adds to the Associative Array if this is a new, unique name
)
);
// The number of Items that have been added to the array = number of unique names
N Items( aa )
Oggetto: Conteggio del numero di elementi unici nella colonna che soddisfano alcuni criteriNon sono sicuro che sia possibile farlo con le funzioni Col, dato che le nuove si comportano in modo leggermente diverso dalle vecchie.
As Constant(n = :name << get values);
curheight = :height;
r = Where(:height <= curheight);
N Items(Set Unique(n[r]));
Oggetto: Conteggio del numero di elementi unici nella colonna che soddisfano alcuni criteriIeri sera ho provato qualcosa di molto simile e JMP si è bloccato. L'ho lasciato in esecuzione tutta la notte e stamattina, al mio ritorno, la finestra della tabella dati di JMP era vuota, non rispondeva e Gestione attività indicava che il computer utilizzava un solo core e aveva più di 40 GB di RAM libera (quindi non si è verificato un esaurimento della RAM né un sovraccarico delle CPU). La mia tabella ha quasi 400.000 righe, quindi penso che questa sia una soluzione con complessità O(N^2)...
Oggetto: Conteggio del numero di elementi unici nella colonna che soddisfano alcuni criteri@jthi Riguardo al mio commento precedente, anche questa sembra una soluzione O(N^2). (È davvero un peccato che una formula errata possa bloccare/mandare in crash l'intera sessione; ieri ho perso una buona parte del mio lavoro pomeridiano a causa di un tentativo di soluzione simile.)
È un peccato che le nuove funzioni di Col non funzionino allo stesso modo, la mia domanda era forse troppo semplicistica, ho bisogno anche delle colonne di raggruppamento e non sono sicuro di come implementarle in questa soluzione. Probabilmente dovrò farlo in Python, il che è un peccato perché la colonna non si aggiornerà automaticamente e gli script Python non possono ancora essere salvati nella tabella.
ps. Nel mio obiettivo di imparare qualcosa da te ad ogni interazione
-- perché questo approccio richiede la funzione "As Constant()"? Cosa succederebbe senza di essa?
Oggetto: Conteggio del numero di elementi unici nella colonna che soddisfano alcuni criteriSe hai bisogno di una formula, non sono sicuro che Python sia la soluzione ideale. La funzione Constant() serve proprio a evitare di dover ripetere l'elenco dei nomi per ogni riga.
Oggetto: Conteggio del numero di elementi unici nella colonna che soddisfano alcuni criteriLa soluzione in Python ha funzionato ed è stata piuttosto veloce da implementare/eseguire, tutto considerato.
Continuo a sperare che Col N Unique() venga rielaborato in una versione futura per renderlo simile agli altri.
Vorrei tanto che esistesse una sorta di "manuale di formule JMP" da poter consultare. Ho programmato attivamente in VBA, AppleScript, Perl, Python e JavaScript (e un po' di C++) per tutti i miei 33 anni di vita adulta, e JSL è di gran lunga il linguaggio più difficile da imparare e comprendere. Non capisco ancora perché As Constant() sia necessario o cosa faccia. Ho letto quasi tutta la Guida allo scripting, ma mi sembra che ce ne vorrebbe un'altra.
Oggetto: Conteggio del numero di elementi unici nella colonna che soddisfano alcuni criteriNon è consigliabile valutare valori che non cambiano a ogni riga dell'esecuzione della formula. Questo è ciò che fa la funzione As Constant(): fa sì che JMP valuti l'espressione una sola volta, sulla prima riga.
Come costante (expr)

Penso che potresti sostanzialmente sostituirlo con (molto probabilmente non esattamente lo stesso, ma abbastanza simile)
If(Row() == 1,
n = :name << get values;
);
Oggetto: Conteggio del numero di elementi unici nella colonna che soddisfano alcuni criteriA rischio di addentrarci troppo in un argomento complesso, ecco un'ultima domanda:
Le formule di colonna vengono effettivamente valutate una sola volta, ma ogni espressione viene valutata nel contesto di un array?
Oppure l'intera formula viene rieseguita una volta per ogni riga, con Row() che indica quale riga è attualmente in fase di valutazione?
O forse sto fraintendendo qualcosa di più fondamentale? Il mio modello mentale di ciò che JMP fa con le formule è diviso in parti incompatibili...
Oggetto: Conteggio del numero di elementi unici nella colonna che soddisfano alcuni criteriQualcuno che conosce i dettagli interni di JMP può dare una risposta migliore della mia ipotesi (forse @Craige_Hales ). Io le considero espressioni (in realtà sono solo JSL) che vengono valutate per ogni riga, direttamente nella tabella dati, quando necessario. Il momento in cui è necessario viene determinato da JMP, a meno che io non ne sopprimasca la valutazione. Ci sono alcune ottimizzazioni, come le funzioni Col, che vengono valutate (nella maggior parte dei casi) una sola volta.
Ci sono alcuni link utili nella Guida di JMP, ma riesco a trovare rapidamente solo questo:
Oggetto: Conteggio del numero di elementi unici nella colonna che soddisfano alcuni criteriEcco una tecnica per esplorare la tana del coniglio:
New Table( "Untitled",
Add Rows( 3 ),
New Column( "a",
Formula(Write( "\!nA" || Char( Row() ) );Row();),
Set Selected
),
New Column( "b",
Formula(Write( "\!nB" || Char( Row() ) );:c + :d + 100;)
),
New Column( "c",
Formula(Write( "\!nC" || Char( Row() ) );:a + 1000;)
),
New Column( "d",
Formula(Write( "\!nD" || Char( Row() ) );:a + 10000;)
),
new column( "e",
formula(write("\!nE" || char(row())); asconstant(write("\!nE as constant "|| char(row())); Q=a+b+c+d); Q;)
)
);
/*
A1 << A must be done first, every other column depends on A
A2
A3
D1
D2
D3
C1
C2
C3
B1 << B must be after C and D
B2
B3
E as constant 1 << the constant is calculated before the first cell, but using row 1
E1 << E must be last; the asconstant value uses all other columns
E2
E3
*/

Il punto e virgola (;) è un operatore JSL che esegue una serie di istruzioni e restituisce il valore dell'ultima istruzione. Ciò significa che un'istruzione print/show/write può essere anteposta a un calcolo per creare una traccia nel log.
Sopra ho appreso che la funzione asconstant(...) viene estratta prima del calcolo della prima riga, ma con la riga 1 come riga corrente.
JMP inoltre analizza le colonne per capire quali possono essere valutate per prime.
Oggetto: Conteggio del numero di elementi unici nella colonna che soddisfano alcuni criteriLa colonna E avrebbe più senso in questo modo:
New Column( "e",
formula(
Write( "\!nE" || Char( Row() ) );
As Constant( Write( "\!nE as constant " || Char( Row() ) ); a + b + c + d; );
)
)
La variabile Q non è necessaria e nasconde lo scopo di AsColumn.
Oggetto: Conteggio del numero di elementi unici nella colonna che soddisfano alcuni criteriEcco un altro link che a volte può essere utile (non forzare tutto in un'unica formula) Utilizzo di JMP > Crea formule in JMP > Crea formule in JMP

Un ulteriore vantaggio è che, in presenza di più formule, è molto più facile verificarne i risultati e, in alcuni casi, eseguire il debug delle formule stesse.