uso de parámetros en 'seleccionar dónde' y 'selección de nombre en columna'Hola,
Necesito tomar una tabla de datos compuesta por dos columnas, X e Y, seleccionar varias filas de la tabla de datos y nombrar la selección. Esto corresponde a seleccionar veinte rectángulos en el espacio cartesiano xy y nombrarlos con un número (del 1 al 20) (estoy trabajando con una imagen).
Escribí un guión pero no funciona. Creo que necesito resolver dos problemas: 1) ¿cómo puedo usar un parámetro, vea X1, X2, .., en el argumento de 'seleccione dónde'? 2) ¿cómo puedo usar un parámetro, ver n_patch, en el argumento de 'selección de nombre en columna'?
Muchas gracias.
Aquí está el guión:
dt = Current Data Table();
X0 = 2332;
Y0 = 558;
n_patch = 0;
delta_x = 100;
delta_y = 100;
dist_y = 488;
dist_x = 656;
L_x = 500;
L_y = 500;
For( n_x = 1, n_x <= 4, n_x++,
For( n_y = 1, n_y <= 5, n_y++,
Xc = X0 - (n_x - 1) * (dist_x) + L_x / 2;
Yc = Y0 + (n_y - 1) * (dist_y) + L_y / 2;
n_patch = n_patch + 1;
X1 = Xc - delta_x;
X2 = Xc + delta_x;
Y1 = Yc - delta_y;
Y2 = Yc + delta_y;
dt << Row Selection(
Select where( (:X >= X1 & :X <= X2) & (Y >= Y1 & Y <= Y2) )
);
dt << Name Selection in Column(
Column Name( "Patch#" ),
Selected( ("n_patch") ),
Unselected( "" )
);
)
);
Tabla de datossecuencias de comandosRe: uso de parámetros en 'seleccionar dónde' y 'selección de nombre en columna'Muchísimas gracias. El código es muy compacto y trabajado.
Re: uso de parámetros en 'seleccionar dónde' y 'selección de nombre en columna'Es posible que esté usando una versión un poco más antigua de JMP, por lo que no estoy seguro de si funcionará para usted (sin usar la selección de fila o la selección de nombre en la columna).
Puede obtener filas de interés con << obtener filas donde y luego establecer valores con columna () [filas]
dt << New Column("Patch#", Character);
For( n_x = 1, n_x <= 4, n_x++,
For( n_y = 1, n_y <= 5, n_y++,
Xc = X0 - (n_x - 1) * (dist_x) + L_x / 2;
Yc = Y0 + (n_y - 1) * (dist_y) + L_y / 2;
n_patch = n_patch + 1;
X1 = Xc - delta_x;
X2 = Xc + delta_x;
Y1 = Yc - delta_y;
Y2 = Yc + delta_y;
wantedRows = dt << get rows where(:X >= X1 & :X <= X2 & :Y >= Y1 & :Y <= Y2);
Column(dt, "Patch#")[wantedRows] = char(n_patch);
)
);Re: uso de parámetros en 'seleccionar dónde' y 'selección de nombre en columna'Hola, muchas gracias por su pronta respuesta.
Tu código me es muy útil, creo que estoy en el camino correcto. Sin embargo, todavía hay algo que no funciona.
Traté de ejecutar su código y vi que agrega muchas columnas con los nombres 'Patch#1', 'Patch#2', etc. así que cambié la línea
Column Name( "Patch#" || char( n_patch ) )
con
Column Name( "Patch#")
porque solo quiero una columna con el nombre Patch#.
Pero el código no selecciona lo que espero que se seleccione. Selecciona solo los parches 5, 10, 15 y 20 y no los otros parches y, además, las filas seleccionadas no corresponden a los parches.
Por lo tanto, no estoy seguro de que el comando de selección funcione correctamente.
Muchas gracias por cualquier ayuda.
Marcello.
Re: uso de parámetros en 'seleccionar dónde' y 'selección de nombre en columna'Hola @MFVIT ,
Debe asegurarse de que los valores de X1 e Y1 se evalúen en su secuencia de comandos, en lugar de buscar algo en la tabla de datos.Este problema se ilustra en Inserte una expresión en otra usando Eval Insert, Eval Expr, Parse y Substitute . Puede asegurarse de que esto suceda utilizando Eval( Eval Expr( ) ). Aquí hay un ejemplo usando su código con una tabla de datos de ejemplo.
Names default to here(1);
dt = New Table( "Example Data",
Add Rows( 10000 ),
New Column( "X", Numeric, "Continuous", Format( "Best", 12 ),
Formula( Random Uniform( 0, 10000 ) ) ),
New Column( "Y", Numeric, "Continuous", Format( "Best", 12 ),
Formula( Random Uniform( 0, 10000 ) ) )
);
X0 = 2332;
Y0 = 558;
n_patch = 0;
delta_x = 100;
delta_y = 100;
dist_y = 488;
dist_x = 656;
L_x = 500;
L_y = 500;
For( n_x = 1, n_x <= 4, n_x++,
For( n_y = 1, n_y <= 5, n_y++,
Xc = X0 - (n_x - 1) * (dist_x) + L_x / 2;
Yc = Y0 + (n_y - 1) * (dist_y) + L_y / 2;
n_patch = n_patch + 1;
X1 = Xc - delta_x;
X2 = Xc + delta_x;
Y1 = Yc - delta_y;
Y2 = Yc + delta_y;
Eval( Eval Expr(
dt << Row Selection(
Select where( (:X >= Expr( X1 ) & :X <= Expr( X2 )) & (:Y >= Expr( Y1 ) & :Y <= Expr( Y2 ) ) )
);
) );
dt << run formulas;
dt << Name Selection in Column(
Column Name( "Patch#" || char( n_patch ) ),
Selected( "n_patch = " || char( n_patch ) ),
Unselected( "" )
);
)
);