Valeur maximale de chaque ligne sur plusieurs colonnes et nom correspondant de la colonne sourceBonjour, existe-t-il un moyen simple de trouver la valeur maximale de chaque ligne et le nom de colonne (ou paramètre) correspondant à la valeur maximale ? Ci-dessous un exemple simple pour illustrer la demande :
| T1 | T2 | T3 | T4 | T5 | T6 | T7 | T8 | T9 | T10 | Valeur max | Col_Name (Paramètre) |
| 87,2 | 83,6 | 81,4 | 83 | 83 | 83 | 83 | 82,3 | 83,3 | 84,6 | 87,2 | T1 |
| 85,9 | 84 | 82 | 84 | 83,3 | 83,3 | 84 | 83 | 86,5 | 87,2 | 87,2 | T10 |
| 84,9 | 82,7 | 86 | 83 | 82,3 | 82,3 | 83 | 82 | 83,6 | 85,2 | 86 | T3 |
| 85,6 | 84,6 | 82,7 | 84,6 | 84,3 | 84,3 | 84,3 | 83,6 | 84,9 | 86,2 | 86,2 | T10 |
| 85,2 | 83,6 | 82 | 83,3 | 83 | 83 | 83,3 | 82,3 | 84,3 | 85,6 | 85,6 | T10 |
| 86,8 | 84,3 | 82,7 | 84,3 | 83,6 | 83,6 | 84,3 | 83,3 | 85,9 | 86,2 | 86,8 | T1 |
| 86,2 | 84 | 82,3 | 84 | 87 | 83,3 | 83,6 | 83 | 84,9 | 85,9 | 87 | T5 |
| 88.1 | 84,6 | 82,3 | 84,3 | 83,6 | 84 | 84,3 | 83,3 | 85,9 | 86,2 | 88.1 | T1 |
| 85,6 | 83,3 | 81,7 | 83,3 | 83 | 83 | 83,6 | 82,7 | 84 | 85,9 | 85,9 | T10 |
| 37.4 | 36.1 | 36,4 | 36,4 | 36.1 | 36.1 | 36,4 | 35.4 | 36,7 | 37.4 | 37.4 | T1 |
| 36,7 | 34,5 | 34,8 | 34,5 | 33,8 | 34.1 | 34,5 | 33,5 | 36.1 | 36.1 | 36,7 | T1 |
| 34,8 | 32,9 | 33.2 | 32,9 | 32.2 | 32,5 | 36 | 31,9 | 33,8 | 35.1 | 36 | T7 |
| 38 | 36,4 | 36,4 | 36,4 | 36,4 | 36.1 | 36,7 | 39 | 38 | 38.3 | 39 | T8 |
| 38 | 35.1 | 35.1 | 40 | 34.1 | 34,5 | 34,8 | 33,8 | 36,4 | 37 | 40 | T4 |
Merci!
Re : Valeur maximale de chaque ligne sur plusieurs colonnes et nom correspondant de la colonne sourceJ'ai mal lu votre question au début... donc cette réponse contient une simplification, n'utilisant pas substitutInto, et une variation qui recherche une valeur particulière.
dt = New Table( "Untitled",
Add Rows( 3 ),
New Column( "first", Numeric, "Continuous", Format( "Best", 12 ), Set Values( [1, 5, 9] ) ),
New Column( "second", Numeric, "Continuous", Format( "Best", 12 ), Set Values( [2, 6, 10] ) ),
New Column( "skip", character, setvalues( {"a", "b", "c"} ) ),
New Column( "third", Numeric, "Continuous", Format( "Best", 12 ), Set Values( [3, 7, 11] ) ),
New Column( "fourth", Numeric, "Continuous", Format( "Best", 12 ), Set Values( [4, 8, 12] ) )
);
names = dt << getcolumnnames( "numeric" ); // returns a list of all numeric column names
findval=7;
row = 2;
Row() = row; // names will pull data from the current row
rowpos = Loc( findval==matrix(evallist(names)) );
show(names[rowpos],names[rowpos[1]][row]);
names[rowpos] = {:third};
names[rowpos[1]][2] = 7;
Loc renvoie les positions des éléments non nuls dans une matrice. L'opérateur == avec un scalaire et une matrice renvoie une matrice de 1 et de 0. La fonction Loc renvoie une matrice en rowpos (avec les indices des 1) ; le [1] prend le premier emplacement qui correspond à findval. names[rowpos[1]] est alors un nom de colonne, et la [ligne] obtient la réponse correspondante à partir de la ligne de la colonne.
Re : Valeur maximale de chaque ligne sur plusieurs colonnes et nom correspondant de la colonne sourceMerci Craige!
Au lieu de Concat(), existe-t-il une autre fonction qui peut être utilisée avec Substitute Into() pour rechercher la position d'une valeur particulière dans une ligne sur plusieurs colonnes ?
dt = New Table( "Untitled",
Add Rows( 3 ),
New Column( "first", Numeric, "Continuous", Format( "Best", 12 ), Set Values( [1, 5, 9] ) ),
New Column( "second", Numeric, "Continuous", Format( "Best", 12 ), Set Values( [2, 6, 10] ) ),
New Column( "skip", character, setvalues( {"a", "b", "c"} ) ),
New Column( "third", Numeric, "Continuous", Format( "Best", 12 ), Set Values( [3, 7, 11] ) ),
New Column( "fourth", Numeric, "Continuous", Format( "Best", 12 ), Set Values( [4, 8, 12] ) )
);
names = dt << getcolumnnames( "numeric" ); // returns a list of all numeric column names
Show( names ); // {first, second, third, fourth}
Substitute Into( names, Expr( {} ), Expr( Concat() ) );
Show( Name Expr( names ) ); // first || second || third || fourth
Row() = 2; // names will pull data from the current row
rowpos = Loc( names, 6 ); // works only with a list
Merci,
Ravi
Re : Valeur maximale de chaque ligne sur plusieurs colonnes et nom correspondant de la colonne source(en recherchant IFMax...) oui, ce serait beaucoup plus facile à expliquer si vous pouviez facilement lister les colonnes. Peut-être plus vite aussi. Merci de l'avoir signalé !
Re : Valeur maximale de chaque ligne sur plusieurs colonnes et nom correspondant de la colonne sourceY a-t-il un problème avec l’utilisation de la fonction IFMax dans une nouvelle colonne ?Je me rends compte que si le nombre de colonnes est grand, ce n'est pas pratique, mais s'il n'y a que 20 colonnes ou moins, il est assez simple de simplement saisir la formule IFMax.
Re : Valeur maximale de chaque ligne sur plusieurs colonnes et nom correspondant de la colonne sourceL'indexation des tables de données est une nouveauté dans JMP 13.
Vous pouvez essayer quelque chose comme cette idée pour créer une expression qui créera une matrice vectorielle de ligne à partir de la ligne actuelle lors de son évaluation.
dt = New Table( "Untitled",
Add Rows( 3 ),
New Column( "first", Numeric, "Continuous", Format( "Best", 12 ), Set Values( [1, 5, 9] ) ),
New Column( "second", Numeric, "Continuous", Format( "Best", 12 ), Set Values( [2, 6, 10] ) ),
New Column( "skip", character, setvalues( {"a", "b", "c"} ) ),
New Column( "third", Numeric, "Continuous", Format( "Best", 12 ), Set Values( [3, 7, 11] ) ),
New Column( "fourth", Numeric, "Continuous", Format( "Best", 12 ), Set Values( [4, 8, 12] ) )
);
names = dt << getcolumnnames( "numeric" ); // returns a list of all numeric column names
Show( names ); // {first, second, third, fourth}
Substitute Into( names, Expr( {} ), Expr( Concat() ) );
Show( Name Expr( names ) ); // first || second || third || fourth
Row() = 2; // names will pull data from the current row
rowvec = (Eval( names )); // [5 6 7 8]
Étant donné une liste de noms de lignes, la fonction Substitute Into() remplace l’opérateur de liste d’accolades par la fonction concat. La fonction Concat est la même que la || opérateur de concaténation et peut prendre beaucoup d’arguments. La concaténation évalue chaque référence de colonne dans la liste pour la ligne actuelle. Les valeurs scalaires individuelles sont concaténées dans la matrice de lignes.
Re : Valeur maximale de chaque ligne sur plusieurs colonnes et nom correspondant de la colonne sourceSalut Craige,
Lorsque j'exécute votre exemple de script dans JMP 10, je reçois un message d'erreur indiquant : l'argument doit être une matrice{1} lors de l'accès ou de l'évaluation de 'Loc Max', mauvais argument...
L'indexation des tables de données n'est-elle pas autorisée dans JMP10 ?
Merci!
Re : Valeur maximale de chaque ligne sur plusieurs colonnes et nom correspondant de la colonne sourceOK, il me manque quelque chose..... ci-joint ma sortie. Lorsque je vérifie les résultats, la colonne MaxVal contient la valeur maximale trouvée dans les colonnes 3 à 25 de cette ligne, et MaxVal_Col est le nom de la colonne où la valeur maximale a été trouvée.
Qu'est-ce que je rate?
Re : Valeur maximale de chaque ligne sur plusieurs colonnes et nom correspondant de la colonne sourceMerci encore Jim ! Cependant, si vous examinez le résultat, je pense que vous remarquerez qu'il n'est pas correct.
Re : Valeur maximale de chaque ligne sur plusieurs colonnes et nom correspondant de la colonne sourceOK... mon erreur, je pensais que vous n'étiez pas en mesure d'exécuter le code, pas que vous obteniez des résultats invalides. Le problème est que votre liste de colonnes, "colnames", ne correspond pas à la liste des colonnes sur lesquelles vous effectuez le Loc Max. Les noms de première et deuxième colonnes doivent être supprimés de la liste « colnames ». Le problème a également provoqué un problème lors de l'obtention du MaxVal à l'aide de l'instruction :
MaxVal = dt[r, emplacement];
puisqu'il examinerait la table de données entière et que l'emplacement qu'il renvoyait est basé sur une matrice qui a 2 colonnes de moins que la table de données.
J'ai donc fait une simple réécriture montrant un moyen de surmonter le problème
dt = Open( "C:/data.jmp" );
colnames = dt << getcolumnnames;
For( i = 2, i >= 0, i--,
colnames = Remove( colnames, i, 1 )
);
For Each Row(
r = Row();
location = Loc Max( dt[r, 3 :: 25] ); // location of maximum value in array from Col #3 to #25
//MaxVal = dt[r, location];
MaxVal_Col = colnames[location] << getname;
MaxVal = as column(eval(MaxVal_Col));
);
Re : Valeur maximale de chaque ligne sur plusieurs colonnes et nom correspondant de la colonne sourceMerci Jim! C'est ce que j'ai obtenu et le résultat n'est pas correct, par exemple, les lignes n°1 et n°2.
Re : Valeur maximale de chaque ligne sur plusieurs colonnes et nom correspondant de la colonne sourceMerci Jim! C'est ce que j'ai obtenu et le résultat n'est pas correct, par exemple, les lignes n°1 et n°2.
Re : Valeur maximale de chaque ligne sur plusieurs colonnes et nom correspondant de la colonne sourceJ'ai vu des erreurs suspectes dues à la mise en cache. La seule façon de contourner ces problèmes est de redémarrer mon système d'exploitation et non JMP lui-même.
Pourriez-vous exécuter le script mis à jour mais après un redémarrage du système d'exploitation et vérifier ?
Re : Valeur maximale de chaque ligne sur plusieurs colonnes et nom correspondant de la colonne sourceVoici le tableau de données après avoir exécuté le script
Re : Valeur maximale de chaque ligne sur plusieurs colonnes et nom correspondant de la colonne sourceMerci beaucoup Jim pour la réponse! Par contre, ça ne marche toujours pas pour moi avec dt=table de données actuelle(). Pas sûr de ce qui se passe. BTW, pourriez-vous m'envoyer le fichier de sortie que vous avez généré ?
Merci!
Re : Valeur maximale de chaque ligne sur plusieurs colonnes et nom correspondant de la colonne sourceLe script et la table de données ont très bien fonctionné pour moi.Maintenant, j'ai changé le
dt=Open("........");
à
dt=current data table();
Puisque la table était déjà ouverte.
Donc, je vous suggère d'essayer cela, ou de placer une instruction supplémentaire après votre instruction dt=Open :
wait(0);
Il est possible que votre table de données ne soit pas terminée avant le début de l'opération Pour chaque ligne.L'attente (0); forcera l'ouverture à se terminer avant d'exécuter l'option Pour chaque ligne
Re : Valeur maximale de chaque ligne sur plusieurs colonnes et nom correspondant de la colonne sourceCela ne fonctionne toujours pas correctement pour moi. Ci-joint, veuillez trouver le script et les fichiers de données. Pourriez-vous s'il vous plaît me faire savoir ce que j'ai fait de mal ici ?
Merci!
Re : Valeur maximale de chaque ligne sur plusieurs colonnes et nom correspondant de la colonne sourceBon point. L'exemple pourrait être généralisé comme ceci (disposition des colonnes intentionnellement moche...) Choisissez l’un ou l’autre qui vous convient le mieux. La 2ème a l'avantage de vous isoler des réagencements accidentels des colonnes. Le premier pourrait convenir à des centaines de colonnes.
dt = New Table( "Untitled",
New Column( "maxval", numeric ),
New Column( "a", Numeric, Set Values( [1, 33, 1] ) ),
New Column( "maxcol", Numeric ),
New Column( "b", Numeric, Set Values( [2, 2, 2] ) ),
New Column( "c", Numeric, Set Values( [333, 1, 0] ) ),
);
// either
vars = [2 4 5];
colnames = (dt << getcolumnnames)[vars];
// or
colnames={a,b,c}; // this might be best choice
For Each Row(
row = Row();
location = Loc Max( dt[ row, colnames] ); // location of maximum value in array
col = colnames[location]<<GETNAME></GETNAME>Re : Valeur maximale de chaque ligne sur plusieurs colonnes et nom correspondant de la colonne sourceRésolu, il me manquait le décalage des colonnes qui devaient être ajoutées à la variable d'emplacement.
Re : Valeur maximale de chaque ligne sur plusieurs colonnes et nom correspondant de la colonne sourceJ'ai rencontré un problème ici, si les colonnes que je dois choisir se trouvent entre l'ensemble de données, cela ne semble pas fonctionner.
For Each Row(
r = Row();
// 1::3 means columns 1 through 3. {a,b,c} would also work.
location = Loc Max( dt[ r, 57 :: 113] ); // location of maximum value in array
maxval = dt[r, location];
maxcol = colnames[location] << getname;
);
Je dois choisir les colonnes 57 à 113, mais pour une raison quelconque, lorsque je le fais via le script, j'obtiens des valeurs incorrectes.
Re : Valeur maximale de chaque ligne sur plusieurs colonnes et nom correspondant de la colonne source// this example uses JMP 13 data table indexing
dt = New Table( "Untitled",
New Column( "a", Numeric, Set Values( [1, 33, 1] ) ),
New Column( "b", Numeric, Set Values( [2, 2, 2] ) ),
New Column( "c", Numeric, Set Values( [333, 1, 0] ) ),
New Column( "maxval", numeric ),
New Column( "maxcol", Numeric )
);
colnames = dt << getcolumnnames;
For Each Row(
r = Row();
// 1::3 means columns 1 through 3. {a,b,c} would also work.
location = Loc Max( dt[ r, 1 :: 3] ); // location of maximum value in array
maxval = dt[r, location];
maxcol = colnames[location] << getname;
);
Data table with maximum value from row and name of maximum column for rowData table with maximum value from row and name of maximum column for rowTable de données avec la valeur maximale de la ligne et le nom de la colonne maximale pour la ligne
Article précédent sur l'abonnement aux tables de données
Re : Valeur maximale de chaque ligne sur plusieurs colonnes et nom correspondant de la colonne sourceVous cherchez exactement la même solution.
Pour chaque ligne, recherchez la valeur maximale et renvoyez le nom de la colonne afin que je puisse exécuter des statistiques sur les données résultantes.
Par exemple, pour savoir combien de fois un nom de colonne apparaît comme maximum, le nombre de colonnes qui contribuent à la valeur maximale, le STD DEV, etc.