Iteración más rápidaHola,
Intentando optimizar las iteraciones.
Tengo una tabla de referencia donde cada columna es un nombre de una columna de la tabla de datos principal. Quiero recorrer cada fila de la tabla de datos de referencia y luego agregar los valores de la Columna (dt_main, "Values") a las Nuevas columnas A y Nueva B en la tabla de referencia si Columna (dt_ref, "Nrows")>2 y comentario [yo] == "A > B".
Estoy usando una matriz asociativa porque solo me interesan los últimos valores registrados de cada tipo A y B, asignados al ID de X/Y/Wafer correspondiente.
El siguiente script lleva mucho tiempo. ¿Hay alguna manera de optimizar?
Names Default To Here( 1 );
start = Tick Seconds();
dt_main = Data Table( "maintable" );
dt_ref = Data Table( "referencetable" );
Try( dt_ref << delete columns( :New N, :New R ) );
dt_ref << New Column( "New A", "Numeric" );
dt_ref << New Column( "New B", "Numeric" );
nrows = [];
For( nn = 1, nn <= N Rows( dt_ref ), nn++,
Insert Into( nrows, nn )
);
dt_ref << begin data update;
For Each( {r, i}, nrows,
If( dt_ref:N Rows[i] > 2 & dt_ref:Comment[i] == "A > B",
/// Create AA to get the last recorded values for each A and B to the corresponding X/Y/Wafer ID from dt_main
countsessions = Associative Array(
dt_main:Type[dt_main << get rows where( dt_main:X Coord == dt_ref:X Coord[i] & dt_main:Y Coord == dt_ref:Y Coord[i] & dt_main:Wafer ID == dt_ref:Wafer ID[i] )],
dt_main:Value[dt_main << get rows where( dt_main:X Coord == dt_ref:X Coord[i] & dt_main:Y Coord == dt_ref:Y Coord[i] & dt_main:Wafer ID == dt_ref:Wafer ID[i] )];
);
Try( dt_ref:New A[i] = countsessions["A"] );
Try( dt_ref:New B[i] = countsessions["B"] );
)
);
dt_ref << end data update;
end = Tick Seconds();
Show( Char( end - start ) );
Automatización y secuencias de comandosRe: iteración más rápidaTomé una ruta diferente, utilizando las plataformas JMP Select, Join, Split y Update integradas. Funciona muy rápido y parece que obtengo los mismos resultados, excepto por las filas A>B que en su tabla de referencia tienen valores faltantes... pero los valores que se me ocurren coinciden con N(A) y N(b). ) columnas. Así que puede que esté completamente fuera de lugar.
Names Default To Here( 1 );
start = Tick Seconds();
dt_main = Data Table( "maintable" );
dt_ref = Data Table( "referencetable" );
Try( dt_ref << delete columns( :New A, :New B ) );
// Create a subset of the maintable that contains only data for the rows in
// the reference table that have comment value of A>B
// Select only A>B rows in reference table
dt_ref << select where(:Comment == "A > B");
dtAB = dt_ref<<SUBSET>0, dtMainJoin << delete rows);
dtMainJoin = dtMainJoin << sort(by(:RowNum), Order(ascending), Replace table(1));
dtMainJoin << delete columns(:RowNum);
// Split the table to create the New A and New B Columns
dtSplit = dtMainJoin <<
Split(
Split By( :Type ),
Split( :Value ),
Group( :X Coord, :Y Coord, :Wafer ID ),
Output Table(
"Split of Join of maintable with Subset of referencetable 2 by Type"
),
Sort by Column Property
);
// Clean up dtMainJoin table by closing it
close(dtMainJoin, nosave);
// Rename the A and B columns
dtSplit:A << set name("New A");
dtSplit:B << set name("New B");
// Use Update to merge the dtSplit data into the reference table
dt_ref << Update(
With(
Data Table(
dtSplit
)
),
Match Columns( :X Coord = :X Coord, :Y Coord = :Y Coord, :Wafer ID = :Wafer ID )
);
// Clean up
close( dtSplit, nosave );
dt_ref << end data update;
end = Tick Seconds();
Show( Char( end - start ) );</SUBSET>