Ho cercato di estrarre il secondo numero più grande dalle tabelle JMP. Finora, l'ho fatto solo manualmente usando
Ordina discendente(Eval List( {:X1, :X2, :X3}));
Come posso semplicemente passare l'intera tabella anziché i nomi delle singole colonne?

Il tuo componente di confronto nella tua funzione IF() ha un problema logico.
If( (Abs( colMax )) > 300 | (Abs( colMax )) > 250
qualsiasi valore > 250 renderà vero il confronto, quindi il >300 non è necessario.
Il confronto deve solo essere:
If( ( Abs( colMax ) > 250,
Mi chiedi perché stai ottenendo valori di 193?Questo perché i valori stampati sono il secondo valore più alto per la colonna e il filtro si basa sul valore massimo nella colonna.Il secondo valore più alto può essere di qualsiasi valore.Se hai i seguenti valori in una colonna
Il valore massimo della colonna è 600, quindi passerebbe la tua clausola IF() di Max Col() > 250 e il secondo valore più alto nella colonna è 193
Riguardo alla tua domanda su " come posso trovare il numero di riga del secondo valore più alto, ad esempio colSecondMaxValues?", il modo per farlo è già nello script.La dichiarazione
maxRows = dt << get rows where( As Column( dt, colNamesList[i] ) == colMax );
restituisce una matrice dei numeri di riga per le righe che hanno i valori massimi nella colonna.Se vuoi i numeri di riga per il secondo valore più alto, devi solo ottenere le righe dove corrispondono al secondo valore massimo.Quindi se aggiungi questa istruzione dopo la funzione Inserisci in(), otterrai le righe che hanno il secondo valore più alto
Show(
dt << get rows where(
As Column( dt, colNamesList[i] ) == Col Max( Column( dt, colNamesList[i] ) )
)
);
Ecco il codice 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;
);
);@io Mi dispiace, ma ho bisogno dei valori di ogni colonna e non di un'intera tabella.
@txnelson Grazie per la sceneggiatura. Sto cercando di far funzionare una condizione maggiore di 300 o 250 per questo script e non riesco a capire perché occorra ancora valori come 193. Inoltre, come posso trovare il numero di riga del secondo valore più alto, ad esempio colSecondMaxValues? Grazie mille per il tuo aiuto.
dt=open("$SAMPLE_DATA/semiconductor capability.jmp");
colNamesList= dt<<GET column="" names=""> 300 | (abs(colMax)) > 250,
maxRows = dt<<GET rows="" where=""></GET></GET>Se vuoi il secondo valore più grande dell'intera tabella, indipendentemente dalla colonna in cui si trova:
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}];Ecco un piccolo script che ho scritto che determina il secondo valore più alto su tutte le colonne continue in una tabella di dati
names default to here(1);
dt=open("$SAMPLE_DATA/semiconductor capability.jmp");
colNamesList= dt<<GET column="" names=""></GET>