Suchen Sie nach dem nächstgelegenen Wert<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />Hallo alle,
Ich muss nach dem nächsten Wert von etwas in einer Spalte suchen.Gibt es dafür eine Funktion (die ich einfach nicht finden kann) oder muss ich dafür meine eigene Routine erstellen?
Danke, Natalie
Betreff: Nach dem nächstgelegenen Wert suchenIch danke Ihnen für Ihre Hilfe!Es klappt.
Betreff: Nach dem nächstgelegenen Wert suchenverwenden
col = Column( dtFile1, "X_location" );
JMP-Objekte (wie die Datentabelle in dtFile1) ignorieren normalerweise stillschweigend Nachrichten (wie <Betreff: Nach dem nächstgelegenen Wert suchen
Entschuldigung für die langsame Antwort; Ich bin auf etwas anderes gestoßen.Ich habe zunächst Ihre zweite Lösung ausprobiert, aber ich bekomme sie überhaupt nicht zum Laufen.Ich schaffe es nicht einmal, den Mindestwert der Spalte zu finden ...Was ist los?Mir ist aufgefallen, dass meine Spalte eine Zeichenfolgenspalte und keine numerische Spalte war, also habe ich sie konvertiert, aber das schien nichts zu helfen.
Spalte ( dtFile1 , „X_Standort“ ) << Datentyp ( „Numerisch“ ) ;
Kol = dtFile1 << Spalte ( „X_Standort“ ) ;
Reihen = Ort Min ((( Kol << getValues ))) ;
Betreff: Nach dem nächstgelegenen Wert suchenEine weitere Möglichkeit, KDTable zu verwenden.
dt = Open( "$sample_data/big class.jmp" );
// die Eingabematrix für kdtable erstellen: [95 59, 123 61, 74 55, ...
data = (dt:weight << getasmatrix) || (dt:height << getasmatrix);
// Nachschlagetabelle erstellen
lookup = KDTable( data );
// Führen Sie eine Beispielsuche durch: Finden Sie die 10 Personen, die einem Gewicht von 100 Pfund und einer Körpergröße von 60 am nächsten kommen
// Zoll innerhalb eines Abstands von 5. (5 ist in den gleichen „Einheiten“ wie Gewicht und Pfund ... normalisieren?)
{rowNumbers, distances} = lookup << knearestrows( {10, 5}, [100 60] );
// Ergebnisse anzeigen
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 b=99 h=64 d=4,12310562561766
CHRIS B=99 H=64 T=4,12310562561766
MARK w=104 h=62 d=4,47213595499958
KATIE b=95 h=59 t=5,09901951359278
also ist d=4,123 sqrt((100-99)^2+(60-64)^2).Als Katie entdeckt wurde, war der Radius von 5 überschritten, sodass die angeforderten 10 Ergebnisse durch den Radius begrenzt waren.
KDTable arbeitet mit K-dimensionalen Daten; Möglicherweise benötigen Sie nur K=1 (z. B. nur Gewicht) oder K=3 (einschließlich Alter).Das Skalierungs-/Normalisierungsproblem wird in diesen Daten mit zunehmendem Alter deutlicher, da der Bereich viel kleiner ist als die Größe oder das Gewicht.Ist der Abstand vom 13. zum 14. Lebensjahr größer oder kleiner als der Abstand von 75 Pfund auf 80 Pfund?
edit: Nur mit dem Gewicht sieht es noch einfacher aus:
dt = Open( "$sample_data/big class.jmp" );
// Nachschlagetabelle erstellen
lookup = KDTable( dt:weight << getasmatrix );
// Führen Sie eine Beispielsuche durch: Finden Sie die 10 Personen, die einem Gewicht von 100 Pfund am nächsten kommen
{rowNumbers, distances} = lookup << knearestrows( {10, 5}, [100] );
// Ergebnisse anzeigen
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 d=1
CHRIS w=99 d=1
JOHN w=98 d=2
MARK w=104 d=4
KATIE w=95 d=5
JOE w=105 d=5
MICHAEL w=95 d=5
TON w=105 d=5
DANNY w=106 d=6
Betreff: Nach dem nächstgelegenen Wert suchenIm Folgenden finden Sie zwei Möglichkeiten, die Zeile(n) mit dem nächsten Wert abzurufen. Die erste gibt eine Matrix von Zeilennummern zurück und ermöglicht somit Bindungen. Für den zweiten Ansatz, der die LocMin()-Funktion verwendet, wird davon ausgegangen, dass es einen eindeutigen nächstgelegenen Wert gibt; Es wird nur die Zeilennummer der ersten Instanz zurückgegeben und etwaige Bindungen werden vernachlässigt.
Namen standardmäßig hier ( 1 ) ;
dt = Offen ( „$SAMPLE_DATA\Big Class.jmp“ ) ;
Kol = Spalte ( "Gewicht" ) ;
// Alle Zeilen auswählen, die einem Wert am nächsten kommen
Wert = 99,5 ;
D = Abs (( Kol << Werte bekommen ) - Wert ) ;
Reihen = Ort ( D == Mindest ( D )) ;
Zeigen ( Reihen ) ;
dt << Zeilen auswählen ( Reihen ) ;
// Erste Zeile auswählen, die einem Wert am nächsten kommt
Wert = 112 ;
Reihen = Ort Min ( Abs (( Kol << Werte erhalten ) - Wert )) ;
Zeigen ( Reihen ) ;
dt << Zeilen auswählen ( Reihen ) ;
Betreff: Nach dem nächstgelegenen Wert suchenOder Sie können einen Matrixvektor erstellen
rowmat=index(1,N Rows(dt));
und sortieren Sie es dann mit derselben Rangmatrix
rowmatsorted = rowmat;
und dann enthält es die Zeilennummern in derselben Reihenfolge wie Ihre sortierte Wertematrix. Wenn Sie also die nächstgelegene Wertposition aus der Wertematrix erhalten, wird dieselbe Position in der rowmatsorted-Matrix die Zeilennummer haben
Betreff: Nach dem nächstgelegenen Wert suchenDanke Jim, das ist großartig.
Das kann ich auf jeden Fall gebrauchen.Allerdings muss ich die Zeilennummer kennen, damit ich den entsprechenden Wert in der nächsten Spalte erhalten kann.
Nachdem ich Ihre Funktion verwendet und den nächstgelegenen Wert gefunden habe, sollte ich dann in den Originaldaten nach diesem Wert suchen, um die Zeilennummer zu finden?
Betreff: Nach dem nächstgelegenen Wert suchenNatalie,
Hier ist eine einfache Funktion, die ich geschrieben habe und die den Wert zurückgibt, der dem Zielwert am nächsten kommt.
Namen standardmäßig hier ( 1 ) ;
dt = offen ( „$SAMPLE_DATA\Semiconductor Capability.jmp“ ) ;
findClosest = Funktion ( { Wert , Kol } ,
{ A , R , aa , gleich darüber , knapp unter , Wert , Kol } ,
A = Spalte ( Kol ) << Werte erhalten ;
R = Rang ( A ) ;
aa = sortiert = A [ R ] ;
B = 108 ;
gleich darüber = aa [ Ort ( aa > Wert )[ 1 ]] ;
knapp unter = aa [ Ort ( aa < Wert )[ N Zeilen ( Ort ( aa < B ) )]] ;
Wenn ( gleich darüber - Wert < Wert - knapp unter ,
gleich darüber ,
) ;
) ;
zeigen ( Minimum = findClosest ( 108 , „NPN1“ )) ;