Wie füge ich Daten aus einer Tabelle zu einer anderen Tabelle hinzu, basierend auf der DistanzIch habe zwei Datentabellen für zwei Messsätze auf dem Wafer. Jede Tabelle hat vier Spalten, wobei X und Y die Messorte darstellen, und zwei Spalten mit Messdaten für jede Tabelle. Die Messungen werden nicht von den exakt gleichen Positionen (X, Y) des Wafers erfasst. Ich möchte eine der Tabellen basierend auf der Nähe der Messorte aktualisieren (zusätzliche Spalten der anderen Tabelle hinzufügen). Um es klarer auszudrücken: Ich hätte gerne eine kombinierte Tabelle (insgesamt 8 Spalten), die auf der Zuordnung von X1, Y1 zum nächstgelegenen Punkt auf X2 und Y2 basiert. Bitte sehen Sie sich das Bild an, das ich hochgeladen habe. Ich weiß, dass die Distanzfunktion wahrscheinlich verwendet werden kann, um eine Matrix aller Distanzen von einem gegebenen X, Y zu erstellen, bin mir aber nicht sicher, wie ich den JSL-Code schreiben soll, um die aktualisierte Tabelle für mich zu berechnen.
Automatisierung und SkriptingDatenzusammenführung und -bereinigungWindowsBetreff: Wie füge ich Daten aus einer Tabelle basierend auf der Entfernung zu einer anderen Tabelle hinzu?Schauen Sie sich neben Distanz auch folgende Funktionen an
Fügen Sie dann einen zeilenbasierten Index zu Ihrer „Haupttabelle“ hinzu, verwenden Sie einen davon, um den nächstgelegenen Index (im Grunde eine Zeile) zu finden, fügen Sie ihn zu Ihrer zweiten Tabelle hinzu und verwenden Sie dann abschließend Update/Join, um die Tabellen zu kombinieren.
Betreff: Wie füge ich Daten aus einer Tabelle basierend auf der Entfernung zu einer anderen Tabelle hinzu?Basierend auf den @jthi -Links glaube ich, dass dies das tut, was Sie wollen
dt1=New Table( "Table 1",
Add Rows( 20 ),
New Column( "x",
Numeric,
"Continuous",
Format( "Best", 12 ),
Formula( Random Normal() )
),
New Column( "y",
Numeric,
"Continuous",
Format( "Best", 12 ),
Formula( Random Normal() )
),
Set Row States( [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0] )
);
dt2=New Table( "Table 2",
Add Rows( 20 ),
New Column( "x",
Numeric,
"Continuous",
Format( "Best", 12 ),
Formula( Random Normal() ),
Set Display Width( 120 )
),
New Column( "y",
Numeric,
"Continuous",
Format( "Best", 12 ),
Formula( Random Normal() ),
Set Selected,
Set Display Width( 118 )
),
Set Row States( [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0] )
);
M1 = dt1 << GetAsMatrix();
MD1=vptree(M1);
M2 = dt2 << GetAsMatrix();
MD2=kdtable(M2);
//returns the nearest point of Table 1 to a point in table 2
//to reverse the look up, make MD1-> MD2 and M2->M1
{rows, dist} = MD1 << K nearest rows( 1, M2);
dt1<<NEW column=""></NEW>Steve
Betreff: Wie füge ich Daten aus einer Tabelle basierend auf der Entfernung zu einer anderen Tabelle hinzu?Hallo Steve und Jarmo,
Danke für die Vorschläge. Das Skript war auch nützlich. Wenn ich es jedoch ausführe, glaube ich nicht, dass es den kürzesten Abstand findet. Beispielsweise stimmt die erste Zeile von Tabelle 1 mit Zeile 8 (Abstand von ~1,37) von Tabelle 2 überein, aber es gibt viele viel nähere Punkte wie Zeile Nummer 1 (Abstand von 0,69) (lassen Sie den Abstand sqrt[(x-x0)^2+(y-y0)^2])

Betreff: Wie füge ich Daten aus einer Tabelle basierend auf der Entfernung zu einer anderen Tabelle hinzu?Ich glaube, ich habe die Datentabellen am Ende des Skripts verwechselt. Versuchen Sie Folgendes:
dt1=New Table( "Table 1",
Add Rows( 20 ),
New Column( "x",
Numeric,
"Continuous",
Format( "Best", 12 ),
Formula( Random Normal() )
),
New Column( "y",
Numeric,
"Continuous",
Format( "Best", 12 ),
Formula( Random Normal() )
),
Set Row States( [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0] )
);
wait(0.0);
dt1:x << suppress eval( true );
dt1:y << suppress eval( true );
dt2=New Table( "Table 2",
Add Rows( 20 ),
New Column( "x",
Numeric,
"Continuous",
Format( "Best", 12 ),
Formula( Random Normal() ),
Set Display Width( 120 )
),
New Column( "y",
Numeric,
"Continuous",
Format( "Best", 12 ),
Formula( Random Normal() ),
Set Selected,
Set Display Width( 118 )
),
Set Row States( [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0] )
);
wait(0.0);
dt2:x << suppress eval( true );
dt2:y << suppress eval( true );
M1 = dt1 << GetAsMatrix();
MD1=vptree(M1);
M2 = dt2 << GetAsMatrix();
MD2=kdtable(M2);
//returns the nearest point of Table 1 to a point in table 2
//to reverse the look up, make MD1-> MD2 and M2->M1
{rows, dist} = MD1 << K nearest rows( 1, M2);
dt2<<NEW column=""></NEW>I virtual linked them and did some visual checks so I believe we are good now
<SPAN class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="shampton82_0-1724013813741.png" style="width: 400px;"><SPAN class="lia-inline-image-display-wrapper" image-alt="shampton82_0-1724013813741.png" style="width: 400px;"><SPAN class="lia-inline-image-display-wrapper" image-alt="shampton82_0-1724013813741.png" style="width: 400px;"><SPAN class="lia-inline-image-display-wrapper" image-alt="shampton82_0-1724013813741.png" style="width: 400px;"><SPAN class="lia-inline-image-display-wrapper" image-alt="shampton82_0-1724013813741.png" style="width: 400px;"><SPAN class="lia-inline-image-display-wrapper" image-alt="shampton82_0-1724013813741.png" style="width: 400px;"><SPAN class="lia-inline-image-display-wrapper" image-alt="shampton82_0-1724013813741.png" style="width: 400px;"><SPAN class="lia-inline-image-display-wrapper" image-alt="shampton82_0-1724013813741.png" style="width: 400px;"><SPAN class="lia-inline-image-display-wrapper" image-alt="shampton82_0-1724013813741.png" style="width: 400px;"><SPAN class="lia-inline-image-display-wrapper" image-alt="shampton82_0-1724013813741.png" style="width: 400px;"><SPAN class="lia-inline-image-display-wrapper" image-alt="shampton82_0-1724013813741.png" style="width: 400px;"><SPAN class="lia-inline-image-display-wrapper" image-alt="shampton82_0-1724013813741.png" style="width: 400px;"><SPAN class="lia-inline-image-display-wrapper" image-alt="shampton82_0-1724013813741.png" style="width: 400px;"><span class="lia-inline-image-display-wrapper" image-alt="shampton82_0-1724013813741.png" style="width: 400px;"><img src="https://us.v-cdn.net/6038925/uploads/images/67225i8663690D9A1ED800/shampton82_0-1724013813741.png" role="button" title="shampton82_0-1724013813741.png" alt="shampton82_0-1724013813741.png" /></span></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN>
Betreff: Wie füge ich Daten aus einer Tabelle basierend auf der Entfernung zu einer anderen Tabelle hinzu?I still see it is not picking up the closest points: <BR />Names Default To Here( 1 );
Close All(data tables);
Clear Log();
Clear Symbols();
dt1= Open(
"C:\Users\Table 1.jmp");
wait(0.0);
dt1:X1 << suppress eval( true );
dt1:Y1 << suppress eval( true );
dt2= Open(
"C:\Users\Table 2.jmp");
wait(0.0);
dt2:X2 << suppress eval( true );
dt2:Y2 << suppress eval( true );
M1 = dt1 << GetAsMatrix();
MD1=vptree(M1);
M2 = dt2 << GetAsMatrix();
MD2=kdtable(M2);
//returns the nearest point of Table 1 to a point in table 2
//to reverse the look up, make MD1-> MD2 and M2->M1
{rows, dist} = MD1 << K nearest rows( 1, M2);
dt1<<NEW column=""></NEW>Betreff: Wie füge ich Daten aus einer Tabelle basierend auf der Entfernung zu einer anderen Tabelle hinzu?dt1=New Table( "Table 1",
Add Rows( 20 ),
New Column( "x",
Formula( Random Uniform(0,10) )
),
New Column( "y",
Formula( Random Uniform(0,10) )
)
);
dt2=New Table( "Table 2",
Add Rows( 64 ),
New Column( "x2",
Formula( floor(row()/8)+1 )
),
New Column( "y2",
Formula( mod(row(),8)+1 )
)
);
// M2 = dt2 << GetAsMatrix();
// better - see below
M2 = dt2[0, {"x2", "y2"}];
MD2=kdtable(M2);
dt1 << New Column( "row_orig",Nominal, Formula( Row() ));
dt2 << New Column( "row_2",Nominal,Formula( Row() ));
dt1 << New Column( "table",Nominal, set each value(1));
dt2 << New Column( "table",Nominal, set each value(2));
wait(0);
// step by step, for each row in dt1, use MD2 to find the closest position in dt2
dt1 << new column("row_2",Nominal, set each value(
pos = Matrix({:x, :y});
(MD2 << K nearest rows( 1, pos))[1][1]));
// concatenate the tables to generate a combined plot
dt2:x2 << set name("x");
dt2:y2 << set name("y");
check = dt1 << Concatenate(dt2);
check << Graph Builder(
Show Control Panel( 0 ),
Variables( X( :x ), Y( :y ), Overlay( :row_2 ), Color( :table ) ),
Elements(
Line( X, Y, Row order( 1 ) ),
Points( X, Y, Overlay( 0 ), Legend( 2 ) )
),
SendToReport(
Dispatch( {}, "400", ScaleBox,
{Legend Model(
2,
Properties( 0, {Marker( "FilledSquare" )}, Item ID( "1", 1 ) ),
Properties( 1, {Marker( "Circle" )}, Item ID( "2", 1 ) )
)}
)
)
);

Betreff: Wie füge ich Daten aus einer Tabelle basierend auf der Entfernung zu einer anderen Tabelle hinzu?Danke, dass du das für mich aufgeräumt hast , @hogi !
Frage: Können Sie mir erklären, was diese Codezeile macht?
dt1 << new column("row_2",Nominal, set each value(pos = Matrix({:x, :y});(MD2 << K nearest rows( 1, pos))[1][1]));
Dank!
Betreff: Wie füge ich Daten aus einer Tabelle basierend auf der Entfernung zu einer anderen Tabelle hinzu?Danke Hogi,
Das läuft wie am Schnürchen, allerdings hatte ich genau die gleiche Frage wie Steve:
Kannst du die Zeile erklären
dt1 << new column("row_2",Nominal, set each value(pos = Matrix({:x, :y});(MD2 << K nearest rows( 1, pos))[1][1]));Wenn ich meine Version ausführe (und die Tabellen mit vier Spalten (x, y, Daten 1, Daten 2) in Tabelle 1 und (x2, y2, Daten 3, Daten 4) lese), erhalte ich außerdem die folgende Warnung. Ich denke, es liegt ein Fehler vor, weil Tabelle 1 und Tabelle 2 mehr als zwei Spalten (x, y) haben, die nicht in der Matrix enthalten sind. Aber wenn Sie die Zeile erklären, denke ich, dass ich den Rest herausfinden kann! Danke für die Hilfe

Betreff: Wie füge ich Daten aus einer Tabelle basierend auf der Entfernung zu einer anderen Tabelle hinzu?Hallo @spinup
Ich denke, das Problem liegt darin, dass mein Code davon ausgegangen ist, dass Sie nur die x- und y-Werte in der Tabelle haben. Wenn Sie mit Ihren Tabellen beginnen, die zusätzliche numerische Spalten haben, versucht k Nearest Neighbors, den nächstgelegenen Punkt für X, Y, A, B gegenüber X, Y, C, D zu finden.
Ich denke, deshalb funktionieren @hogi -Codes so gut, wenn nur X und Y betrachtet werden.
Wenn Sie die Nicht-X/Y-Spalten als Zeichenspalten erstellt und meinen zweiten Code ausgeführt hätten, würde es funktionieren. Sie müssten sie nach dem Verbinden nur wieder in numerische Spalten ändern.
Betreff: Wie füge ich Daten aus einer Tabelle basierend auf der Entfernung zu einer anderen Tabelle hinzu?So etwas in der Art ist das, was bei mir normalerweise herauskommt
Names Default To Here(1);
dt1 = New Table("Table 1",
Add Rows(20),
New Column("x", Numeric, "Continuous", Formula(Random Normal())),
New Column("y", Numeric, "Continuous", Formula(Random Normal()))
);
dt2 = New Table("Table 2",
Add Rows(20),
New Column("x", Numeric, "Continuous", Formula(Random Normal())),
New Column("y", Numeric, "Continuous", Formula(Random Normal())),
New Column("Val", Numeric, Continuous, Formula(Random Normal(2, 100)))
);
m1 = dt1[0, {"x", "y"}];
m2 = dt2[0, {"x", "y"}];
tree = VPTree(m2);
{rows, distances} = tree << K Nearest Rows(1, m1);
dt1 << New Column("Nearest", Numeric, Ordinal, Values(rows));
dt1 << New Column("Distance", Numeric, Ordinal, Values(distances));
dt2 << New Column("Row", Numeric, Ordinal, Values(1::N Rows(dt2)));
/* Depending on the wanted result, using Update might be better */
dt_result = dt1 << Join(
With(dt2),
By Matching Columns(:Nearest = :Row),
Drop multiples(0, 0),
Include Nonmatches(0, 0),
Preserve main table order(1),
Output Table("Result")
);
/*
Close(dt1, no save);
Close(dt2, no save);
*/
Join/K Nearest Rows könnte in die falsche Richtung ausgeführt werden, da ich die Ergebnisse nicht überprüft habe
Betreff: Wie füge ich Daten aus einer Tabelle basierend auf der Entfernung zu einer anderen Tabelle hinzu?Um die Matrix mit den Koordinaten zu erhalten, können Sie die Datentabellen-Indizierung verwenden, wie es Jarmo in seinem Beispiel tut:
Zeile = 0 -> alle Zeilen
Spalten: x und y
coordinates as matrix = dt1[0, {"x", "y"}];Betreff: Wie füge ich Daten aus einer Tabelle basierend auf der Entfernung zu einer anderen Tabelle hinzu?Die Dokumentation von VPTree könnte optimiert werden.
KD-Tabelle:

KDTable << K nearest rows hat zwei Modi:
- Standard: Die Eingabepositionen als Startpunkte verwenden.
-> für uns nicht geeignet.
- optional: Verwenden Sie eine einzelne Position als Ausgangspunkt.
-> ja!
Ich berechne diesen Punkt als pos = Matrix ({:x,:y}) für jede Zeile und gebe ihn als zweites Argument für die K nächsten Zeilen an
Die Rückgabewerte sind Vektoren aus Zeilen und Abständen. Mit [1][1] kann ich zuerst die Zeilen und dann den ersten (und einzigen) Eintrag erhalten.
Leider gibt es keine Möglichkeit, einen Satz Startpunkte als Eingabe bereitzustellen.
VPTree:
Für K nearest Rows gibt es keine richtige Dokumentation im Scripting Index, aber es gibt ein Beispiel direkt in der Definition von VPTree:

und es gibt einige Dokumentationen in der Online-Hilfe:


klingt nach den gleichen 2 Optionen wie für KDTable.
Anhand des Beispiels von @jthi können Sie erkennen, dass VPTree einen dritten Modus zulässt, bei dem eine Reihe von Positionen als Matrix bereitgestellt wird.
Das ist ein wenig überraschend, aber sehr praktisch 
tree = VPTree(m2);
{rows, distances} = tree << K Nearest Rows(1, m1);
dt1 << New Column("Nearest", Numeric, Ordinal, Values(rows));
Betreff: Wie füge ich Daten aus einer Tabelle basierend auf der Entfernung zu einer anderen Tabelle hinzu?VPtree << K Nearest Rows(1, matrix of coordinates);
Hübsch : ):)
Betreff: Wie füge ich Daten aus einer Tabelle basierend auf der Entfernung zu einer anderen Tabelle hinzu?Weitere Ideen:
- zugehöriger Wunsch für 1D: Fuzzy-Join / Asof-Merge / Join nach Spalten hinzufügen, die keine exakten Übereinstimmungen haben
Ich habe gerade einen Kommentar hinzugefügt, um höhere Dimensionen zu berücksichtigen.
- In realen Anwendungsfällen gibt es zusätzliche nominale Koordinaten wie Lots, Wafer, Varianten. Der Benutzer muss die Daten entsprechend aufteilen und für jede „Variante“ separate VPTrees einrichten. VPTree mit groupBy ist ein logischer nächster Schritt.
- Andererseits möchte der Benutzer vielleicht die Eingabedaten interpolieren, um aussagekräftigere Werte zu erhalten, anstatt einfach einen benachbarten Wert zu verwenden. Gruppieren nach – sooo nützlich!!! Wie wäre es mit „Interpolieren“?