Equivalente a un indice (Match()) in ExcelHo alcuni dati per i quali vorrei calcolare la % di errore tra la prima e tutte le misurazioni successive per ogni ID univoco. Non sono riuscito a capire come ottenere dati da una cella in base ai valori di altre righe-colonne. Richiede JSL o posso semplicemente creare una formula come ho fatto in Excel.
Vorrei che le due colonne che ho evidenziato venissero calcolate utilizzando una formula, ma con migliaia di righe di dati nel set effettivo, potrei capire se deve essere uno script e i valori devono essere statici finché lo script non viene eseguito di nuovo.

Ogni aiuto sarà apprezzato.
Sto utilizzando JMP 16.
Analisi e modellazione dei dati di baseRe: Equivalente a un indice (Match()) in ExcelÈ possibile ottenere la misurazione più precoce utilizzando Col Min(Row(), :ID)
:Measurement[Col Min(Row(), :ID)]
Puoi quindi utilizzarlo in una colonna separata o semplicemente utilizzarlo come parte di una singola formula che calcolerà il risultato
Re: Equivalente a un indice (Match()) in ExcelGrazie, funziona.
Ho però un dubbio: cosa succederebbe se volessi usare il secondo valore per ogni ID?
Quindi per ID == A avrei 10,00001 nella colonna "Misurazione più antica".
Re: Equivalente a un indice (Match()) in ExcelCi sono parecchie opzioni diverse, ma possono essere un po' difficili da capire. L'idea "più semplice" è quella di combinare la funzione statistica Col con l'istruzione if e l'istruzione if restituisce un valore mancante o il valore che stai cercando.
Col Min(If(Col Cumulative Sum(1, :ID) == 2, :Measurement, .), :ID)

Il vantaggio dell'utilizzo delle funzioni statistiche Col è che funzionano bene con il raggruppamento delle colonne e come formule.
Re: Equivalente a un indice (Match()) in ExcelIl metodo che considererei più "simile a JMP" è la soluzione interattiva che consente a JMP di creare un processo automatizzato (utilizzando un generatore di log/flussi di lavoro avanzato) e quindi di correggere i "problemi" lasciati dallo script creato da JMP:
Poiché hai già la colonna Ordine che presumo tu possa usare, crea un sottoinsieme solo di Ordine == 2. Fai clic con il pulsante destro del mouse -> seleziona le celle corrispondenti -> crea un sottoinsieme


Dal sottoinsieme rinomina la colonna Misurazione in qualcos'altro. Quindi torna alla tua tabella originale e usa Aggiorna per unire il sottoinsieme alla tua tabella usando ID come colonna di condizione di corrispondenza

e ora hai la tua misurazione dall'ordine due in una colonna. E JMP ti scriverà uno script come questo:
// Select matching cells
Data Table("JMP Example") << Select Where(:Order == 2);
// Subset data table
// → Data Table("Subset of JMP Example")
Data Table("JMP Example") << Select Where(:Order == 2) <<
Subset(Copy formula(0), Selected Rows(1), Selected columns only(0));
// Change column name: Measurement → Measurement_ORDER2
Data Table("Subset of JMP Example"):Measurement << Set Name("Measurement_ORDER2");
// Update data table
Data Table("JMP Example") << Update(
With(Data Table("Subset of JMP Example")),
Match Columns(:ID = :ID),
Add Columns from Update Table(:Measurement_ORDER2),
Replace Columns in Main Table(None)
);
Non è sicuramente il miglior script, ma funziona e dà un'idea di cosa si sta facendo. Puoi anche avviare la registrazione del flusso di lavoro prima di iniziare questo processo e creare un flusso di lavoro per automatizzarlo (personalmente non uso i flussi di lavoro e preferisco il registro avanzato, ma possono essere molto utili, soprattutto se desideri automatizzare qualcosa). Lo script creato da workflow builder potrebbe assomigliare a questo
Names Default To Here(1);
Workflow 6=function({},
step_name = "Open Data Table: JMP Example.jmp";
//Open Data Table: JMP Example.jmp
Open("$DOWNLOADS/JMP Example.jmp");
step_name = "Select matching cells";
//Select matching cells
Data Table("JMP Example") << Select Where(:Order == 2);
step_name = "Subset data table";
//Subset data table
Data Table("JMP Example") << Select Where(:Order == 2) <<
Subset(Selected Rows(1), Selected columns only(0));
step_name = "Change column name: Measurement → Measurement2";
//Change column name: Measurement → Measurement2
Data Table("Subset of JMP Example"):Measurement << Set Name("Measurement2");
step_name = "Update data table";
//Update data table
Data Table("JMP Example") << Update(
With(Data Table("Subset of JMP Example")),
Match Columns(:ID = :ID),
Add Columns from Update Table(:Measurement2),
Replace Columns in Main Table(None)
);
step_name = "Close Data Table: Subset of JMP Example";
//Close Data Table: Subset of JMP Example
Close(Data Table("Subset of JMP Example"), NoSave);
);
Workflow 6();
In genere gli script creati da workflow builder hanno problemi simili a quelli creati da log migliorati, ma workflow ha dei vantaggi extra (se vuoi considerarli in questo modo, io li considero per lo più fastidiosi, se non altro, rispetto a cose molto semplici come l'aggiornamento dei riferimenti). Ed ecco come modificherei lo script creato da JMP
Names Default To Here(1);
dt = Open("$DOWNLOADS/JMP Example.jmp");
dt << Clear Column Selection << Clear Select;
rows_of_interest = dt << Get Rows Where(:Order == 2);
dt_subset = dt << Subset(Rows(rows_of_interest),
Copy formula(0),
Selected columns only(0),
Invisible
);
Column(dt_subset, "Measurement") << Set Name("Measurement_ORDER2");
dt << Update(
With(dt_subset),
Match Columns(:ID = :ID),
Add Columns from Update Table(:Measurement_ORDER2),
Replace Columns in Main Table(None)
);
Close(dt_subset, no save);
Questi possono essere fatti anche usando JSL "più avanzato", ma in genere se vuoi usare formule ed evitare JSL, non li userei. L'unico caso in cui utilizzarli è se hai bisogno di velocità e anche in quel caso potrebbero a volte finire per essere più lenti a meno che non li ottimizzi. Ecco un'opzione che usa JSL con alcuni commenti per spiegare
Vedi altro...
Names Default To Here(1);
dt = Open("$DOWNLOADS/JMP Example.jmp");
// Get all IDs into a list using data table subscripting
ids = dt[0, "ID"];
// Get all unique IDs using Summarize (there are many other methods)
// Note that Summarize will change numeric values to strings (doesn't matter in this case)
Summarize(dt, uniq_ids = By(:ID));
// We can loop over the unique IDs while collecting results
// I will store results to Associative Array as it is efficient method and easy to access
aa_idpos = Associative Array();
aa_meas = Associative Array();
idx_of_interest = 2;
For Each({cur_id}, uniq_ids,
// We can use Loc to find specific ID from a list of IDs
cur_idx = Loc(ids, cur_id);
// From this we can pick second index for example and store it to our aa
// Note: Usually you want to check that there is at least two items if you do this
aa_idpos[cur_id] = cur_idx[2];
// You could also get the Measurement value instead
// (I prefer index as then I can access value from any of the columns easily)
aa_meas[cur_id] = :Measurement[cur_idx[idx_of_interest]];
);
// Show(aa_idpos);
// Then you can basically do whatever you want with these
// Fill them into the table for example by using Formula OR For Each Row
// Formula tends to be faster if you just need one column
new_col = dt << New Column("Second Meas by ID", Numeric, Continuous, Formula(
aa_meas[:ID]
));
// aa_meas WON'T be evaluated unless you specifically do it, so either remove the formula
// or evaluate it using eval(evalexpr()) / eval(substitute())
dt << run formulas;
new_col << Delete Formula();
<BR />/*
// or evaluation (one option, there many other options (local variables, not worrying about the scope, ...))
new_col = Eval(EvalExpr(
dt << New Column("Second Meas by ID", Numeric, Continuous, Formula(
aa = As Constant(Expr(aa_meas));
aa[:ID]
));
));<BR />*/
Re: Equivalente a un indice (Match()) in ExcelSe sai che i tuoi dati sono ordinati, come nella tabella dei dati campione, e supponendo che ci sarà sempre un secondo valore, allora
:Measurement[Col Min( Row(), :ID ) + 1]
è un modo molto semplice per utilizzare la seconda riga della serie.
Re: Equivalente a un indice (Match()) in ExcelSulla falsariga di quanto suggerito da @txnelson , potresti usare anche questo:

:Measurement[Col Maximum( If( :Order == 2, Row() ), :ID )]
Ciò restituirebbe la seconda misurazione per ciascun ID.
@JasonWS
Ho messo insieme questo PowerPoint per spiegare come fare cose simili a vlookup in excel per i nuovi utenti di JMP. Spero che possa essere utile.
Steve
Spero che sia utile!
Re: Equivalente a un indice (Match()) in ExcelL'argomento diventa più complicato se si desidera aggregare più voci per il riferimento o se ci sono righe escluse.
Oltre a ciò, se si eseguono spesso calcoli di questo tipo durante il lavoro quotidiano, non si desidera creare la formula ripetutamente/manualmente.
Nella colonna Nuova formula/Distribuzionale della Lista dei desideri è presente un desiderio : "Normalizza" .
ma l'interesse da parte degli altri utenti è piuttosto basso: solo 2 Kudos...
Quindi ho seguito il consiglio di @mia_stephens

... e ho sviluppato il mio AddIn. Lo puoi trovare nel Marketplace:
https://marketplace.jmp.com/appdetails/Normalization+GUI
Il componente aggiuntivo fornisce un'interfaccia utente per generare automaticamente tali calcoli.
Oltre a molte altre opzioni, c'è un'opzione per "nome", "cognome" e "N-1".

È anche possibile utilizzare la seconda voce per la normalizzazione.
Basta attivare

e utilizzare una colonna Classifica/Ordine come spiegato da @shampton82 :

Alla fine la formula apparirà così:

Molto simile all'approccio di @shampton82 :
Utilizza un'aggregazione Col ... per distribuire i valori di riferimento alle altre righe.
Una sottile differenza: distribuisce i valori, non gli indici di riga .