Filtro de datos detenido en un bucle forEstoy escribiendo un script de bucle for para buscar los valores x de los picos máximos y en algunas partes de los espectros recopilados en diferentes condiciones experimentales. Sin embargo, el filtro de datos se detuvo después de ejecutarse una ronda con la advertencia "Su selección se modificó en otra ventana". ¿Cómo puedo deshacerme de esta advertencia para que el script pueda ejecutarse sin problemas para completar el bucle for?
Permítanme utilizar el ejemplo Big Class.jmp para demostrar el problema. El objetivo es mostrar el subconjunto de datos correspondiente a las personas que tienen el peso máximo (valor máximo de y) en varios rangos de alturas (rangos de valores de x, por ejemplo, 55-60, 60-62, 62-65) por diferentes edades (similar a las condiciones experimentales).
Los rangos de valores x se agrupan en dos listas, una que contiene los límites inferiores y otra que contiene los límites superiores. El máximo se encuentra mediante Col Maximum con Data Filter. El cálculo se repite en bucle para varios rangos de valores x a lo largo de las listas. Sin embargo, después de ejecutar for i=1, el bucle se detiene y aparece la advertencia Data Filter. ¿Cómo deshacerse de ella para permitir que el script complete el bucle for?
Names Default To Here( 1 );
ListA = {55, 60, 62};
ListB = {60, 62, 65};
for(i=1, i<=3, i++,
dt = Data Table( "Big Class" );
Current Data Table (dt);
a = ListA[i];
b = ListB[i];
dt << Data Filter(Add Filter(columns(:height), where(:height > a & :height < b)), Mode( Select( 0 ), Show( 0 ), Include( 1 )), Show Window(0), Auto Clear(1));
dt << select where (col maximum(:weight, :age, Excluded()) == :weight & :height > a & :height < b);
dt << subset(selected rows(1), columns({"name", "age", "sex", "height", "weight"}));
dt << Clear Row States;
dt << Clear Select();
);
Automatización y scriptingRe: El filtro de datos se detuvo en un bucle forCreo que el JSL simplificado a continuación te brindará lo que quieres.
Names Default To Here( 1 );
dt =
// Open Data Table: semiconductor capability.jmp
// → Data Table( "semiconductor capability" )
Open( "$SAMPLE_DATA/big class.jmp" );
ListA = {55, 60, 62};
ListB = {60, 62, 65};
For( i = 1, i <= 3, i++,
a = ListA[i];
b = ListB[i];
Current Data Table( dt );
theMax = Col Maximum( If( :weight & :height > a & :height < b, :weight, . ) );
dt << select where( theMax == :weight & :height > a & :height < b );
If( N Rows( dt << get selected rows ) > 0,
dt << subset( selected rows( 1 ), columns( {"name", "age", "sex", "height", "weight"} ) )
);
dt << Clear Row States;
Wait( 0 );
);Re: El filtro de datos se detuvo en un bucle forSin embargo, este script no tiene la función "por edad". Por ejemplo, en mi script, cuando i = 2 (ListaA = 60, ListaB = 62), el resultado es
| Nombre | Edad | Sexo | Altura | Peso |
| JAIME | 12 | M | 61 | 128 |
| ALICIA | 13 | F | 61 | 107 |
| Judía | 14 | F | 61 | 81 |
Sin embargo, su guión proporciona la parte correspondiente como
| Nombre | Edad | Sexo | Altura | Peso |
| JAIME | 12 | M | 61 | 128 |
Esto se debe a que mi script tiene la parte "por edad" en Col Maximum. Lamentablemente, incluso si agrego la parte "por edad" en su script:
theMax = Col Maximum( If( :weight & :height > a & :height < b, :weight, . ), :age );
Aparece una alerta: "Número de fila no válido"
Tu script se ejecuta sin problemas. ¿Cómo podemos agregar la parte "por edad" en la columna máxima de tu script?
Re: El filtro de datos se detuvo en un bucle forEche un vistazo a la documentación de Col Max: en realidad, puede realizar todo el trabajo necesario.
Simplemente use una columna auxiliar height_bin (por ejemplo, a través de Transformar columna). No es necesario un filtro de datos...

Según esta tabla son James, Barbara, Judy y Marion.
Si desea definir height_bins a través de un filtro de datos, asegúrese de no omitir los puntos de unión, por ejemplo, altura = 60.
Names Default To Here( 1 );
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
dt << New Column( "height_bin",
"Character",
Formula(
If(
:height < 60, "<60",
:height <62, "<62",
">=62"
)
) );
New Column( "weight_max",
Formula( Col Maximum( :weight, :age, :height_bin ) )
);
New Column( "is max",nominal,
Formula( :weight == :weight_max ),
);
Graph Builder(
Variables( X( :age ), Y( :weight ), Group Y( :height_bin ) ),
Elements( Bar( X, Y, Label( "Label by Row" ) ) ),
Local Data Filter( Add Filter( columns( :is max ), Where( :is max == 1 ) ) )
);