J'ai essayé d'extraire les deuxièmes plus grands nombres des tables JMP. Jusqu'à présent, je ne l'ai fait que manuellement en utilisant
Tri décroissant( Eval List( {:X1, :X2, :X3}));
Comment puis-je simplement passer la table entière plutôt que les noms de colonnes individuelles ?

Votre composant de comparaison dans votre fonction IF() a un problème de logique.
If( (Abs( colMax )) > 300 | (Abs( colMax )) > 250
toute valeur > 250 rendra la comparaison vraie, par conséquent, > 300 n'est pas nécessaire.
La comparaison n'a besoin que d'être :
If( ( Abs( colMax ) > 250,
Vous demandez pourquoi vous obtenez des valeurs de 193 ?En effet, les valeurs imprimées sont la deuxième valeur la plus élevée de la colonne et votre filtrage est basé sur la valeur maximale de la colonne.La deuxième valeur la plus élevée peut être de n'importe quelle valeur.Si vous aviez les valeurs suivantes dans une colonne
La valeur maximale de la colonne est 600, donc elle passerait votre clause IF() de Max Col() > 250, et la deuxième valeur la plus élevée dans la colonne est 193
Concernant votre question sur " comment puis-je trouver le numéro de ligne de la deuxième valeur la plus élevée, c'est-à-dire colSecondMaxValues?", la façon de le faire est déjà dans le script.La déclaration
maxRows = dt << get rows where( As Column( dt, colNamesList[i] ) == colMax );
renvoie une matrice des numéros de ligne pour les lignes qui ont les valeurs maximales dans la colonne.Si vous voulez les numéros de ligne pour la deuxième valeur la plus élevée, il vous suffit d'obtenir les lignes où ils sont égaux à la deuxième valeur maximale.Donc, si vous ajoutez cette instruction après la fonction Insert Into(), vous obtiendrez la ou les lignes qui ont la deuxième valeur la plus élevée
Show(
dt << get rows where(
As Column( dt, colNamesList[i] ) == Col Max( Column( dt, colNamesList[i] ) )
)
);
Voici le code complet
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 Je suis désolé, mais j'ai besoin des valeurs de chaque colonne et non d'une table entière.
@txnelson Merci pour le scénario. J'essaie de faire fonctionner une condition supérieure à 300 ou 250 pour ce script et je ne comprends pas pourquoi il prend encore des valeurs comme 193. Aussi, comment puis-je trouver le numéro de ligne de la deuxième valeur la plus élevée, c'est-à-dire colSecondMaxValues? Merci beaucoup pour votre aide.
dt=open("$SAMPLE_DATA/semiconductor capability.jmp");
colNamesList= dt<<GET column="" names=""> 300 | (abs(colMax)) > 250,
maxRows = dt<<GET rows="" where=""></GET></GET>Si vous voulez la deuxième plus grande valeur de tout le tableau, quelle que soit la colonne dans laquelle elle se trouve :
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}];Voici un petit script que j'ai écrit qui détermine la deuxième valeur la plus élevée dans toutes les colonnes continues d'une table de données
names default to here(1);
dt=open("$SAMPLE_DATA/semiconductor capability.jmp");
colNamesList= dt<<GET column="" names=""></GET>