Equivalente a un índice (Match()) en ExcelTengo algunos datos para los que me gustaría calcular el % de error entre la primera medición y todas las mediciones posteriores para cada ID único. No he podido descubrir cómo obtener datos de una celda en función de los valores de otras filas y columnas. ¿Esto requiere JSL o puedo crear una fórmula como lo hice en Excel?
Me gustaría que las 2 columnas que he resaltado se calculen usando una fórmula, pero con miles de filas de datos en el conjunto real, podría entender si tiene que ser un script y los valores estáticos hasta que se ejecute el script nuevamente.

Cualquier ayuda sería apreciada.
Estoy usando JMP 16.
Análisis y modelado de datos básicosRe: Equivalente a un índice (Match()) en ExcelPuede obtener la medición más temprana utilizando Col Min(Row(), :ID)
:Measurement[Col Min(Row(), :ID)]
Luego puede usarlo en una columna separada o simplemente usarlo como parte de una fórmula única que calculará su resultado.
Re: Equivalente a un índice (Match()) en ExcelGracias, eso funciona.
Sin embargo, tengo una inquietud: ¿qué pasa si quiero usar el segundo valor para cada ID?
Entonces, para ID == A, tendría 10.00001 en la columna "Medición más temprana".
Re: Equivalente a un índice (Match()) en ExcelHay muchas opciones diferentes, pero pueden resultar un poco difíciles de entender. La idea "más simple" es combinar la función estadística Col con la declaración if y la declaración if devuelve el valor que falta o el valor que está buscando.
Col Min(If(Col Cumulative Sum(1, :ID) == 2, :Measurement, .), :ID)

La ventaja de utilizar las funciones estadísticas Col es que funcionan bien con la agrupación de columnas y como fórmulas.
Re: Equivalente a un índice (Match()) en ExcelEl método que consideraría más "similar a JMP" es la solución interactiva y permitir que JMP cree un proceso automatizado (utilizando un generador de flujo de trabajo/registro mejorado) y luego solucione los "problemas" que deja el script creado por JMP:
Como ya tienes la columna Orden que supongo que puedes usar, crea un subconjunto de solo Orden == 2. Haz clic derecho -> selecciona las celdas coincidentes -> crea un subconjunto


A partir del subconjunto, cambie el nombre de la columna Medición por otro. Luego, vuelva a la tabla original y utilice Actualizar para volver a unir el subconjunto a la tabla utilizando ID como la columna de condición de coincidencia.

Y ahora tienes tu medida del orden dos en una columna. Y JMP te escribirá un script como este:
// 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)
);
Definitivamente no es el mejor script, pero funciona y da una idea de lo que se está haciendo. También puedes comenzar a registrar el flujo de trabajo antes de comenzar este proceso y crear un flujo de trabajo para automatizarlo (personalmente no uso flujos de trabajo y prefiero el registro mejorado, pero pueden ser muy útiles, especialmente si deseas automatizar algo). El script creado por el generador de flujo de trabajo podría verse así
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();
En general, los scripts creados por el generador de flujo de trabajo tienen problemas similares a los creados por registros mejorados, pero el flujo de trabajo tiene beneficios adicionales (si desea considerarlos así, los considero principalmente molestos, si acaso, en lugar de cosas muy simples como actualizar referencias). Y así es como modificaría el script creado por 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);
También se pueden hacer usando JSL "más avanzado", pero en general, si quieres usar fórmulas y evitar JSL, no las usaría. El único caso en el que puedes utilizarlas es si necesitas velocidad e incluso en ese caso, a veces pueden resultar más lentas a menos que las optimices. Aquí hay una opción que usa JSL con algunos comentarios para explicarlo.
Ver más...
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 índice (Match()) en ExcelSi sabe que sus datos están ordenados, como en su tabla de datos de muestra, y asumiendo que siempre habrá un segundo valor, entonces
:Measurement[Col Min( Row(), :ID ) + 1]
Es una forma muy sencilla de utilizar la segunda fila de la serie.
Re: Equivalente a un índice (Match()) en ExcelSiguiendo la línea de lo que sugirió @txnelson , también podrías usar esto:

:Measurement[Col Maximum( If( :Order == 2, Row() ), :ID )]
Esto devolvería la segunda medición para cada ID.
@JasonWS
Preparé esta presentación en PowerPoint para explicar cómo hacer cosas como la búsqueda vertical en Excel para los nuevos usuarios de JMP. Espero que también pueda ser de ayuda.
Steve
¡Espero que ayude!
Re: Equivalente a un índice (Match()) en ExcelEl tema se vuelve más complicado si desea agregar varias entradas para la referencia o si hay filas excluidas.
Además de eso, si aplicas dichos cálculos a menudo durante el trabajo diario, no querrás crear la fórmula una y otra vez / manualmente.
Hay un deseo en la columna Nueva Fórmula/Distribución de la Lista de Deseos: "Normalizar" .
pero el interés de otros usuarios es bastante bajo: solo 2 Kudos...
Entonces seguí el consejo de @mia_stephens

... y desarrollé mi propio complemento. Se puede encontrar en Marketplace:
https://marketplace.jmp.com/appdetails/Normalization+GUI
El complemento proporciona una interfaz de usuario para generar dichos cálculos automáticamente.
Además de muchas otras opciones, hay una opción para "primero", "último" y "N-1".

También es posible utilizar la segunda entrada para la normalización.
Sólo activar

y usa una columna de Rango/Orden como lo explica @shampton82 :

Al final la fórmula quedará así:

Muy similar al enfoque de @shampton82 :
Utiliza una agregación Col... para distribuir los valores de referencia a las otras filas.
Una diferencia sutil: distribuye los valores, no los índices de fila .