Cálculos entre filas según condicionesHola, soy nuevo en scripting JMP, pero estoy algo acostumbrado a Python. Intento lograr lo siguiente con mi tabla de prueba ficticia:
1) Recorra todas las filas (tanto antes como después de la fila) y haga cálculos solo en aquellas filas donde Cuvette == 11, en las filas restantes donde Cuvette != 11 la "Salida" se puede configurar en NA o lo que sea.
2) El cálculo se realiza entre dos filas separadas. En las filas con Cubeta = 11, la celda de 850 nm de la fila debe dividirse entre la celda de 250 nm de la fila que cumple dos condiciones:
a) Cubeta == 12
b) El valor de aprobación debe coincidir entre las filas, p. ej., valor de aprobación para la cubeta 11 == valor de aprobación para la cubeta 12
| Aprobar |
850 nm |
250 nm |
Taza decorativa |
Producción |
| 1 |
100 |
200 |
11 |
100/500 = 0,2 |
| 2 |
400 |
500 |
11 |
400 / 400 = 1 |
| 3 |
300 |
100 |
11 |
300 / 900 = 0,33 |
| 1 |
700 |
500 |
12 |
ESO |
| 2 |
200 |
400 |
12 |
ESO |
| 3 |
400 |
900 |
12 |
ESO |
| 1 |
400 |
800 |
13 |
ESO |
| 2 |
500 |
700 |
13 |
ESO |
| 3 |
300 |
700 |
13 |
ESO |
Automatización y scriptingAnálisis y modelado de datos básicosRe: Cálculos entre filas según condicionesPara hacer esto al estilo JMP, generalmente dividirías tus datos y luego realizarías el cálculo ( JMP no es una hoja de cálculo ), luego los volverías a unir o continuarías con los datos divididos.
Pero también puedes usar JSL o Fórmula para hacer este cálculo, pero primero considera la opción de división.
Re: Cálculos entre filas según condicionesBienvenido a la Comunidad.
Aquí hay un ejemplo de cómo abordaría su problema.

Names Default To Here( 1 );
dt = Current Data Table();
// Separate out the Cuvette==12 rows into a separate data table
// and then join the Pass==Pass rows to the Cuvette==11 rows
// Then calculate the Output column
// Select the Cuvette==12 rows
dt << Select Where( :Cuvette == 12 );
// Create a new subsetted data table with those rows
dt12 = dt << Subset( Selected Rows( 1 ), columns( :Pass, :"250 nm"n ) );
// Change 250 nm column name so when joined back to original table
// it will have a unique column name
dt12:"250 nm"n << Set Name( "Divisor" );
// For alignment reasons, add a new column called Cuvette and set
// it equal to 11
dt12 << New Column( "Cuvette", Set Each Value( 11 ) );
// Join the tables using the Update Platform
dt << Update(
With( dt12 ),
Match Columns( :Pass = :Pass, :Cuvette = :Cuvette )
);
// Create the new Output column
dt << New Column( "Output", Set Each Value( :"850 nm"n / :Divisor ) );
// Remove Divisor column since it is no longer needed
dt << delete columns( Divisor );
// Close the subsetted data table since it is no longer needed
Close( dt12, nosave );
// Remove the Selected RowStates from the data table
dt << clear rowstates;
A continuación se presenta un enfoque más directo, pero un método mucho más ineficiente, que produce los mismos resultados. En una tabla de datos grande, este método será bastante lento.
Names Default To Here( 1 );
dt = Current Data Table();
dt << New Column( "Output",
Formula(
foundRow = [];
If( :Cuvette == 11,
curPass = :Pass;
foundRow = Current Data Table() <<
get rows where( :Cuvette == 12 & :Pass == curPass );
If( N Items( foundRow ) > 0,
:"850 nm"n / :"250 nm"n[foundRow[1]]
);
);
)
);
Re: Cálculos entre filas según condicionesAquí hay una opción de matriz, pero usar las funciones de JMP generalmente es más fácil de entender.
Names Default To Here(1);
dt = Current Data Table();
cuvette_start = 11;
cuvette_end = 12;
cuvettes = dt[0, "Cuvette"];
// Data is sorted -> we can just take values and make comparison
start_idx = Loc(cuvettes, cuvette_start);
end_idx = Loc(cuvettes, cuvette_end);
// differences
output = J(1, N Rows(dt), .);
output[start_idx] = dt[start_idx, "850 nm"] :\</img> dt[end_idx, "250 nm"];
dt << new column("R", Numeric, Continuous, Values(output));
Si puede confiar mucho en el orden, puede utilizar una fórmula como esta
If(:Cuvette == 11,
:"850 nm"n / :"250 nm"n[Col Min(If(:Cuvette == 12, Row(), .)) + Row() - 1];
);
El tipo de fórmula final dependerá en gran medida de su caso de uso real (¿los datos están ordenados "correctamente", está buscando más de una comparación de valores, etc.?).