Suche nach dem nächsten 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: Suche nach dem nächsten WertDanke für Ihre Hilfe!Es klappt.
Betreff: Suche nach dem nächsten Wertverwenden
col = Column( dtFile1, "X_location" );
JMP-Objekte (wie die Datentabelle in dtFile1) ignorieren normalerweise Nachrichten (wie <Betreff: Suche nach dem nächsten Wert
Sorry für die langsame Antwort; Mir ist noch was eingefallen.Ich habe zunächst Ihre zweite Lösung ausprobiert, aber ich kann sie überhaupt nicht zum Laufen bringen.Ich kann es nicht einmal dazu bringen, den Mindestwert der Spalte zu finden ...Was ist los?Mir ist aufgefallen, dass meine Spalte eine Zeichenfolgenspalte war, keine numerische Spalte, also habe ich sie konvertiert, aber das schien niemandem zu helfen.
Säule ( dtDatei1 , "X_Standort" ) << Datentyp ( "Numerisch" ) ;
Kol = dtDatei1 << Spalte ( "X_Standort" ) ;
Reihen = Ort Min ((( Kol << getValues ))) ;
Betreff: Suche nach dem nächsten WertEine weitere Möglichkeit, KDTable zu verwenden.
dt = Open( "$sample_data/big class.jmp" );
// Eingabematrix für kdtable erstellen: [95 59, 123 61, 74 55, ...
data = (dt:weight << getasmatrix) || (dt:height << getasmatrix);
// Erstellen Sie die Nachschlagetabelle
lookup = KDTable( data );
// Führen Sie eine Beispielsuche durch: Finden Sie die 10 nächsten Personen mit einem Gewicht von 100 Pfund und einer Größe von 60
// 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 w=99 h=64 d=4.12310562561766
CHRIS w=99 h=64 d=4.12310562561766
MARKE w=104 h=62 d=4.47213595499958
KATIE b=95 h=59 d=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 das Gewicht) oder K=3 (auch das Alter).Das Skalierungs-/Normalisierungsproblem wird bei diesen Daten mit dem Alter offensichtlicher, das einen viel kleineren Bereich als Größe oder Gewicht hat.Ist der Abstand von 13 Jahren zu 14 Jahren größer oder kleiner als der Abstand von 75 Pfund zu 80 Pfund?
edit: Mit nur Gewicht sieht es noch einfacher aus:
dt = Open( "$sample_data/big class.jmp" );
// Erstellen Sie die Nachschlagetabelle
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 sind
{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
JOHANNES w=98 d=2
MARKE 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: Suche nach dem nächsten WertIm Folgenden finden Sie zwei Möglichkeiten, um die Zeile(n) mit dem nächsten Wert zu erhalten. Die erste gibt eine Matrix von Zeilennummern zurück und lässt daher Bindungen zu. Für den zweiten Ansatz, der die LocMin()-Funktion verwendet, wird angenommen, dass es einen eindeutigen nächsten Wert gibt; Es gibt nur die Zeilennummer der ersten Instanz zurück und vernachlässigt alle Bindungen.
Namen standardmäßig hierher ( 1 ) ;
dt = Offen ( "$SAMPLE_DATA\Große Klasse.jmp" ) ;
Kol = Spalte ( "Gewicht" ) ;
// Alle Zeilen auswählen, die einem Wert am nächsten sind
Wert = 99,5 ;
d = Abs (( Kol << Werte bekommen ) - Wert ) ;
Reihen = Lok ( d == Mindest ( d )) ;
Zeigen ( Reihen ) ;
dt << Zeilen auswählen ( Reihen ) ;
// Erste Zeile auswählen, die einem Wert am nächsten liegt
Wert = 112 ;
Reihen = Ort Min ( Abs (( Kol << Werte bekommen ) - Wert )) ;
Zeigen ( Reihen ) ;
dt << Zeilen auswählen ( Reihen ) ;
Betreff: Suche nach dem nächsten WertOder Sie können einen Matrixvektor erstellen
rowmat=index(1,N Zeilen(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ächste Wertposition aus der Wertematrix erhalten, hat dieselbe Position in der rowmatsorted-Matrix die Zeilennummer
Betreff: Suche nach dem nächsten WertDanke Jim, das ist großartig.
Das kann ich auf jeden Fall gebrauchen.Ich muss jedoch die Zeilennummer kennen, damit ich den entsprechenden Wert in der nächsten Spalte erhalten kann.
Nachdem ich Ihre Funktion verwendet und den nächsten Wert gefunden habe, sollte ich in den Originaldaten nach diesem Wert suchen, um die Zeilennummer zu finden?
Betreff: Suche nach dem nächsten WertNatalie,
Hier ist eine einfache Funktion, die ich geschrieben habe, die den Wert zurückgibt, der dem Zielwert am nächsten kommt.
Namen standardmäßig hierher ( 1 ) ;
dt = offen ( "$SAMPLE_DATA\Semiconductor Capability.jmp" ) ;
am nächsten finden = Funktion ( { Wert , Kol } ,
{ a , R , äh , gleich darüber , knapp unter , Wert , Kol } ,
a = Spalte ( Kol ) << Werte bekommen ;
R = Rang ( a ) ;
äh = sortiert = a [ R ] ;
b = 108 ;
gleich darüber = äh [ Lok ( äh > Wert )[ 1 ]] ;
knapp unter = äh [ Lok ( äh < Wert )[ N Zeilen ( Lok ( äh < b ) )]] ;
Wenn ( gleich darüber - Wert < Wert - knapp unter ,
gleich darüber ,
) ;
) ;
Show ( Minimum = am nächsten finden ( 108 , "NPN1" )) ;