Hola comunidad JMP,
Tengo dos tablas de datos diferentes donde comparten una columna en común, Número de lote (Lote para abreviar). (Ejecutando JMP Pro 14.1.0 en W10)
Las tablas de datos provienen de dos fuentes diferentes y tienen diferente número de filas. Quiero usar una de las tablas de datos para seleccionar las filas coincidentes en la otra tabla de datos. Los valores en Lote son continuos/numéricos. dt1 tiene 1430 filas y dt2 tiene 158. Hay más lotes en dt1 que en dt2, por lo que necesito usar dt2 para seleccionar solo los lotes coincidentes en dt1.
Pensé que podría hacer algo simple: dt1<
Creo que puedo hacerlo usando dos bucles for, donde para cada fila en dt1, recorrería dt2 para ver dónde son iguales; desafortunadamente, esto da como resultado 225940 comparaciones, lo cual pensé que sería fácil, pero está llevando a JMP mucho más tiempo. de lo que imaginaba.
Este es el código de selección que escribí:
For(l=1, l<=NRows(dt1), l++,
For(i=1, 1<=NRows(dt2), i++,
dt1<<SELECT where=""></SELECT>Pero no funciona. Parece estar atrapado en un bucle infinito (tuve que forzar el cierre de JMP).
Leí un poco mientras escribía esta publicación y, dado que necesito conservar todas las filas seleccionadas previamente, debo invocar la opción Selección actual ("extender"). Entonces, definitivamente sé que el código anterior no funcionará, pero debería haber hecho algo.
Debe haber una manera más rápida de hacer esto que For Loops, algo más elegante.
Cualquier comentario es muy apreciado.
¡Gracias!,
DS
Aquí hay 2 formas de hacer esto.El primer método utiliza su enfoque, sin embargo, será lento con tablas de datos grandes.
Names Default To Here( 1 );
// create sample data
dtMain = New Table( "Main",
Add Rows( 2 ),
New Column( "lot",
Character,
"Nominal",
Set Values( {"a", "b", "c", "d", "e", "a", "b", "c"} )
)
);
dtSmall = New Table( "Small",
Add Rows( 2 ),
New Column( "lot",
Character,
"Nominal",
Set Values( {"a", "e"} ),
Set Display Width( 49 )
)
);
Names Default To Here( 1 );
dtMain << clear select;
For( i = 1, i <= N Rows( dtSmall ), i++,
dtMain << select where(
dtMain:Lot == dtSmall:Lot[i],
current selection( "extend" )
)
);
El segundo funcionará de manera más eficiente.
Names Default To Here( 1 );
// create sample data
dtMain = New Table( "Main",
Add Rows( 2 ),
New Column( "lot",
Character,
"Nominal",
Set Values( {"a", "b", "c", "d", "e", "a", "b", "c"} )
)
);
dtSmall = New Table( "Small",
Add Rows( 2 ),
New Column( "lot",
Character,
"Nominal",
Set Values( {"a", "e"} ),
Set Display Width( 49 )
)
);
// Create a new column as a Select indicator
dtSmall << New Column( "Select", set each value( 1 ) );
// Update the Main table with values from the Small table
dtMain << Update( With( dtSmall ), Match Columns( :lot = :lot ) );
// Select the matching columns
dtMain << select where( :select == 1 );
// get rid of select columns
dtMain << delete columns( "Select" );
dtSmall << delete columns( "Select" );