Rechercher la valeur la plus proche<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />Salut tout le monde,
J'ai besoin de rechercher la valeur la plus proche de quelque chose dans une colonne.Existe-t-il une fonction (que je ne trouve tout simplement pas) pour le faire, ou dois-je créer ma propre routine pour le faire?
Merci, Nathalie
Re : Recherche de la valeur la plus procheMerci de votre aide!Ça marche.
Re : Recherche de la valeur la plus procheutilisation
col = Column( dtFile1, "X_location" );
Les objets JMP (comme la table de données dans dtFile1) ignorent généralement silencieusement les messages (comme <Re : Recherche de la valeur la plus proche
Désolé pour la réponse lente; J'ai été rattrapé par autre chose.J'ai d'abord essayé votre deuxième solution, mais je n'arrive pas du tout à la faire fonctionner.Je n'arrive même pas à le faire localiser la valeur minimale de la colonne ...Que se passe-t-il?J'ai remarqué que ma colonne était une colonne de chaîne, pas une colonne numérique, alors je l'ai convertie, mais cela n'a pas semblé aider.
colonne ( dtFichier1 , "X_location" ) << Type de données ( "Numérique" ) ;
col = dtFichier1 << Colonne ( "X_location" ) ;
Lignes = Loc Min ((( col << getValues ))) ;
Re : Recherche de la valeur la plus procheUne autre façon d'utiliser KDTable.
dt = Open( "$sample_data/big class.jmp" );
// crée la matrice d'entrée pour kdtable : [95 59, 123 61, 74 55, ...
données = (dt:poids << getasmatrix) || (dt:hauteur << getasmatrix);
// crée la table de recherche
recherche = KDTable( données );
// faire un exemple de recherche : trouver les 10 personnes les plus proches d'un poids de 100 livres et d'une taille de 60
// pouces à une distance de 5. (5 est dans les mêmes "unités" que le poids et les livres... normaliser ?)
{rowNumbers, distances} = lookup << knarestrows( {10, 5}, [100 60] );
// affiche les résultats
For( irow = 1, irow <= N Cols( rowNumbers ), irow++,
rowIndex = rowNumbers[irow] ;
Write( dt:name[rowIndex], " w=", dt:weight[rowIndex], " h=", dt:height[rowIndex], " d=", distances[irow], "\!n" );
);
/* :
ALFRED w=99 h=64 j=4.12310562561766
CHRIS w=99 h=64 j=4.12310562561766
MARQUE w=104 h=62 d=4.47213595499958
KATIE w=95 h=59 j=5.09901951359278
donc d=4.123 est sqrt((100-99)^2+(60-64)^2).Au moment où Katie a été découverte, le rayon de 5 était dépassé, de sorte que les 10 résultats demandés étaient limités par le rayon.
KDTable fonctionne avec des données de dimension K ; vous n'aurez peut-être besoin que de K = 1 (juste le poids, par exemple) ou de K = 3 (inclure également l'âge).Le problème de mise à l'échelle/normalisation est plus évident avec l'âge dans ces données, qui a une plage beaucoup plus petite que la taille ou le poids.La distance entre 13 ans et 14 ans est-elle supérieure ou inférieure à la distance entre 75 livres et 80 livres ?
edit : Avec juste le poids, ça a l'air encore plus simple :
dt = Open( "$sample_data/big class.jmp" );
// crée la table de recherche
lookup = KDTable( dt:weight << getasmatrix );
// faire un exemple de recherche : trouver les 10 personnes les plus proches d'un poids de 100 livres
{rowNumbers, distances} = lookup << knearestrows( {10, 5}, [100] );
// affiche les résultats
For( irow = 1, irow <= N Cols( rowNumbers ), irow++,
rowIndex = rowNumbers[irow] ;
Write( dt:name[rowIndex], " w=", dt:weight[rowIndex], " d=", distances[irow], "\!n" );
);
/* :
ALFRED w=99 j=1
CHRIS w=99 j=1
JOHN w=98 d=2
MARQUE w=104 d=4
CATIE w=95 j=5
JOE w=105 j=5
MICHEL p=95 j=5
ARGILE w=105 d=5
DANNY w=106 d=6
Re : Recherche de la valeur la plus procheVous trouverez ci-dessous deux façons d'obtenir la ou les lignes de la valeur la plus proche. Le premier renvoie une matrice de numéros de lignes et autorise donc les liens. Pour la deuxième approche qui utilise la fonction LocMin(), on suppose qu'il existe une valeur unique la plus proche ; il renverra le numéro de ligne de la première instance uniquement et en négligeant les liens.
Noms par défaut ici ( 1 ) ;
dt = Ouvert ( "$SAMPLE_DATA\Grande classe.jmp" ) ;
col = Colonne ( "lester" ) ;
// Sélectionne toutes les lignes les plus proches d'une valeur
évaluer = 99,5 ;
ré = Abdos (( col << obtenir des valeurs ) - évaluer ) ;
Lignes = Loc ( ré == Min ( ré )) ;
Spectacle ( Lignes ) ;
dt << sélectionner des lignes ( Lignes ) ;
// Sélectionne la première ligne la plus proche d'une valeur
évaluer = 112 ;
Lignes = Loc Min ( Abdos (( col << obtenir des valeurs ) - évaluer )) ;
Spectacle ( Lignes ) ;
dt << sélectionner des lignes ( Lignes ) ;
Re : Recherche de la valeur la plus procheOu, vous pouvez créer un vecteur matriciel
rowmat=index(1,N lignes(dt));
puis triez-le en utilisant la même matrice de classement
rowmatsorted = rowmat;
puis il contiendra les numéros de ligne dans le même ordre que votre matrice de valeurs triées, donc lorsque vous obtenez la position de valeur la plus proche de la matrice de valeurs, la même position dans la matrice triée par lignes aura le numéro de ligne
Re : Recherche de la valeur la plus procheMerci Jim, c'est super.
Je peux certainement l'utiliser.Cependant, j'ai besoin de connaître le numéro de ligne, afin que je puisse obtenir la valeur correspondante dans la colonne suivante.
Après avoir utilisé votre fonction et trouvé la valeur la plus proche, dois-je rechercher cette valeur dans les données d'origine pour trouver le numéro de ligne ?
Re : Recherche de la valeur la plus procheNathalie,
Voici une fonction simple que j'ai écrite qui renvoie la valeur la plus proche de la valeur cible.
Noms par défaut ici ( 1 ) ;
dt = ouvert ( "$SAMPLE_DATA\Semiconductor Capability.jmp" ) ;
trouver le plus proche = Fonction ( { évaluer , col } ,
{ un , R , aa , juste au dessus , juste en dessous , évaluer , col } ,
un = Colonne ( col ) << obtenir des valeurs ;
R = Rang ( un ) ;
aa = trié = un [ R ] ;
b = 108 ;
juste au dessus = aa [ Loc ( aa > évaluer )[ 1 ]] ;
juste en dessous = aa [ Loc ( aa < évaluer )[ N lignes ( Loc ( aa < b ) )]] ;
Si ( juste au dessus - évaluer < évaluer - juste en dessous ,
juste au dessus ,
) ;
) ;
Afficher ( le minimum = trouver le plus proche ( 108 , "NPN1" )) ;