He estado tratando de extraer los segundos números más grandes de las tablas JMP. Hasta ahora, solo lo he estado haciendo manualmente usando
Ordenar descendente (Lista de evaluación ({: X1,: X2,: X3}));
¿Cómo puedo pasar la tabla completa en lugar de los nombres de columnas individuales?

Su componente de comparación en su función IF() tiene un problema de lógica.
If( (Abs( colMax )) > 300 | (Abs( colMax )) > 250
cualquier valor que sea > 250 hará que la comparación sea verdadera, por lo tanto, el > 300 no es necesario.
La comparación solo necesita ser:
If( ( Abs( colMax ) > 250,
¿Preguntas por qué obtienes valores de 193?Esto se debe a que los valores que se imprimen son el segundo valor más alto de la columna y su filtrado se basa en el valor máximo de la columna.El segundo valor más alto puede ser de cualquier valor.Si tuviera los siguientes valores en una columna
El valor máximo de la columna es 600, por lo que pasaría su cláusula IF() de Max Col() > 250, y el segundo valor más alto en la columna es 193
Con respecto a su pregunta sobre " ¿Cómo puedo encontrar el número de fila del segundo valor más alto, es decir, colSecondMaxValues?", la forma de hacerlo ya está en el script.La declaración
maxRows = dt << get rows where( As Column( dt, colNamesList[i] ) == colMax );
devuelve una matriz de los números de fila para las filas que tienen los valores máximos en la columna.Si desea los números de fila para el segundo valor más alto, solo necesita obtener las filas donde equivalen al segundo valor máximo.Entonces, si agrega esta declaración después de la función Insertar en (), obtendrá las filas que tienen el segundo valor más alto
Show(
dt << get rows where(
As Column( dt, colNamesList[i] ) == Col Max( Column( dt, colNamesList[i] ) )
)
);
Aquí está el código completo
dt = Open( "$SAMPLE_DATA/semiconductor capability.jmp" );
colNamesList = dt << get column names( string, continuous, numeric );
colSecondMaxValues = {};
// Loop across all continuous columns and find the Max value in
// a column, delete that value, and then find the second max value
// finally, replace the old values, and save the results
For( i = 1, i <= N Items( colNamesList ), i++,
colMax = Col Max( Column( dt, colNamesList[i] ) );
If( Abs( colMax ) > 250,
maxRows = dt << get rows where( As Column( dt, colNamesList[i] ) == colMax );
Show( maxRows );
Column( dt, colNamesList[i] )[maxRows] = .;
Insert Into( colSecondMaxValues, Col Max( Column( dt, colNamesList[i] ) ) );
Show(
dt << get rows where(
As Column( dt, colNamesList[i] ) == Col Max( Column( dt, colNamesList[i] ) )
)
);
Show( colSecondMaxValues );
Column( dt, colNamesList[i] )[maxRows] = colMax;
);
);@ih Lo siento, pero necesito los valores de cada columna y no de una tabla completa.
@txnelson Gracias por el guión. Estoy tratando de hacer que una condición superior a 300 o 250 funcione para este script y no puedo entender por qué todavía toma valores como 193. Además, ¿cómo puedo encontrar el número de fila del segundo valor más alto, es decir, colSecondMaxValues? Muchas gracias por su ayuda.
dt=open("$SAMPLE_DATA/semiconductor capability.jmp");
colNamesList= dt<<GET column="" names=""> 300 | (abs(colMax)) > 250,
maxRows = dt<<GET rows="" where=""></GET></GET>Si desea el segundo valor más grande en toda la tabla, independientemente de la columna en la que se encuentre:
Names default to here(1);
dt = open( "$SAMPLE_DATA/semiconductor capability.jmp" );
//Find the two largest values in the entire table
Sort Descending(Shape(dt << Get all columns as matrix(),1))[{1, 2}];
//Or, to exclude character columns
Sort Descending(Shape(dt << Get as matrix(dt << get column names(numeric)),1))[{1, 2}];Aquí hay un pequeño script que escribí que determina el segundo valor más alto en todas las columnas continuas en una tabla de datos
names default to here(1);
dt=open("$SAMPLE_DATA/semiconductor capability.jmp");
colNamesList= dt<<GET column="" names=""></GET>