Hola,
Escribí un código para implementar una tabla de búsqueda rudimentaria para un conjunto de datos de voltaje/tiempo. Pero debido al tamaño de mi conjunto de datos, se está congelando.
En resumen, puede haber alrededor de 1000 filas (intervalos de tiempo) para cada ejecución y hay alrededor de 1500 ejecuciones, es decir, 1,5 millones de filas en total. En pocas palabras, estoy haciendo lo siguiente en mi código antes de comenzar a usar la tabla de búsqueda:
- Conjunto de datos de proceso
- Calcular dV/dt a partir de datos
- Utilice tabular para encontrar el pico dV/dt para cada ejecución individual y cree una nueva tabla de datos llamada dt2.
- Cree una nueva columna en el conjunto de datos para escribir el valor máximo de dV/dt junto a cada valor de dV/dt en cada ejecución.
En este punto, mi código comienza a recorrer línea por línea a través de dt1, verificando los diferentes parámetros de prueba que definen la ejecución # contra dt2 y encontrando el pico dV/dt y devolviéndolo a esa línea en dt1.
Mi código para buscar en la tabla de búsqueda se ve así:
Current Data Table( dt1 );<BR /><BR />For Each Row(
v = :sample;
w = :temp;
x = :cell;
y = :vicl;
z = :v_bg;<BR />// Find the row in dt2 that matches v/w/x/y/z
row = dt2 << get rows where( :sample == v & :temp == w & :cell == x & :vicl == y & :v_bg == z);<BR />// get values from the dV/dt peak column in dt2
col = Column(dt2, "dvdt_abs_max") << getValues;<BR />// pick out the value of row[n] from that column and save into the active row in dt1
:dVdt_peak = col[row]
);
Este código funcionó cuando lo probé para un conjunto pequeño, pero una vez que tuve mi conjunto de datos completo, apareció la rueca infinita. Soy bastante nuevo en esto y estoy seguro de que debe haber una forma mejor y más eficiente de hacerlo, pero no lo he descubierto.
Gracias
Gracias por la anotación @David_Burnham , Lo recordaré la próxima vez que use 'Para cada fila'.
Esta función es exactamente lo que estaba buscando. Gracias @txnelson !
Ver @txnelson La respuesta, pero también tenga en cuenta que si bien es bueno escribir 'For Each Row', mi experiencia es que se ejecuta muy lentamente.Un bucle for estándar, es decir, 'For (i=1,i<=nrows(dt),i++' es un método mucho más rápido para iterar sobre las filas de una tabla.
Realmente estás obligando a JMP a hacer esto de la manera más difícil.La forma más sencilla y eficaz de solucionar este problema es utilizar la plataforma de actualización.Debería manejar su búsqueda en filas de 1,5 millones sin problemas.
dt << Update(
With( dt2 ),
Match Columns( :sample == :sample, :temp == :temp, :cell == :cell, :vicl == :vicl, :v_bg == :v_bg ),
Add Columns from Update Table( :dvdt_abs_max )
);
Rápidamente, si ayuda, el motivo de este código es que puedo filtrar y eliminar filas en función de si caen por debajo de algún umbral que sea función del pico dV/dt.