Come faccio ad aggiungere dati da una tabella a un'altra tabella in base alla distanza?Ho due tabelle di dati per due set di misurazioni sul wafer. Ci sono quattro colonne in ogni tabella, X, Y che rappresentano la posizione delle misurazioni e due colonne di dati di misurazione per ogni tabella. Le misurazioni non vengono raccolte esattamente dalle stesse posizioni (X, Y) del wafer. Vorrei aggiornare (aggiungere colonne extra dell'altra tabella) una delle tabelle in base alla vicinanza delle posizioni di misurazione. Per essere più chiaro, vorrei avere una tabella combinata (totale di 8 colonne) basata sulla corrispondenza di X1, Y1 con il punto più vicino su X2 e Y2. Si prega di vedere l'immagine che ho caricato. So che la funzione Distanza può probabilmente essere utilizzata per creare una matrice di tutte le distanze da un dato X, Y ma non sono sicuro di come scrivere il codice jsl per calcolare la tabella aggiornata per me.
Automazione e scriptingFusione e pulizia dei datiFinestreRe: Come faccio ad aggiungere dati da una tabella a un'altra tabella in base alla distanzaScopri le seguenti funzioni oltre alla Distanza
Quindi aggiungi un indice basato sulle righe alla tua tabella "principale", usa uno di questi per trovare l'indice più vicino (in pratica una riga), aggiungilo alla tua seconda tabella e infine usa update/join per combinare le tabelle.
Re: Come faccio ad aggiungere dati da una tabella a un'altra tabella in base alla distanzaIn base ai link di @jthi credo che questo faccia quello che vuoi
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
Re: Come faccio ad aggiungere dati da una tabella a un'altra tabella in base alla distanzaCiao Steve e Jarmo,
Grazie per i suggerimenti. Anche lo script è stato utile. Tuttavia, quando lo eseguo non credo che trovi la distanza più vicina. Ad esempio, nella prima riga della Tabella 1 corrisponde alla riga 8 (distanza di ~1,37) della Tabella 2, ma ci sono molti punti molto più vicini come la riga numero 1 (distanza di 0,69) (lascia che la distanza sia sqrt[(x-x0)^2+(y-y0)^2])

Re: Come faccio ad aggiungere dati da una tabella a un'altra tabella in base alla distanzaPenso di aver confuso le tabelle dei dati alla fine dello script, prova questo:
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>
Re: Come faccio ad aggiungere dati da una tabella a un'altra tabella in base alla distanzaI 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>Re: Come faccio ad aggiungere dati da una tabella a un'altra tabella in base alla distanzadt1=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 ) )
)}
)
)
);

Re: Come faccio ad aggiungere dati da una tabella a un'altra tabella in base alla distanzaGrazie per avermi sistemato questa cosa, @hogi !
Domanda: puoi spiegarmi cosa fa questa riga di codice?
dt1 << new column("row_2",Nominal, set each value(pos = Matrix({:x, :y});(MD2 << K nearest rows( 1, pos))[1][1]));
Grazie!
Re: Come faccio ad aggiungere dati da una tabella a un'altra tabella in base alla distanzaGrazie Hogi,
Funziona alla grande, tuttavia avevo esattamente la stessa domanda di Steve:
Puoi spiegare la linea?
dt1 << new column("row_2",Nominal, set each value(pos = Matrix({:x, :y});(MD2 << K nearest rows( 1, pos))[1][1]));Inoltre, quando eseguo la mia versione (leggendo le tabelle con quattro colonne (x, y, dati 1, dati 2) sulla Tabella 1 e (x2, y2, dati 3, dati 4)) ricevo l'avviso seguente. Penso che sia arrabbiato perché la Tabella 1 e la Tabella 2 hanno più di due colonne (x, y) che non sono nella matrice. Ma se spieghi la riga, penso di poter capire il resto! Grazie per l'aiuto

Re: Come faccio ad aggiungere dati da una tabella a un'altra tabella in base alla distanzaCiao @spinup
Penso che il problema sia che il mio codice ha dato per scontato che nella tabella ci fossero solo i valori x e Y. Se inizi con le tue tabelle che hanno colonne numeriche extra, allora k nearest neighbors sta cercando di trovare il punto più vicino per X,Y, A, B rispetto a X,Y,C,D.
Penso che sia per questo che i codici @hogi funzionano così bene se considerano solo X e Y.
Se creassi un carattere per le colonne non X/Y ed eseguissi il mio secondo codice, funzionerebbe; dovresti solo convertirle di nuovo in numeri dopo averle unite.
Re: Come faccio ad aggiungere dati da una tabella a un'altra tabella in base alla distanzaDi solito finisco per ottenere qualcosa del genere
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 potrebbe essere eseguito nella direzione sbagliata poiché non ho verificato i risultati
Re: Come faccio ad aggiungere dati da una tabella a un'altra tabella in base alla distanzaPer ottenere la matrice con le coordinate, puoi utilizzare l'indicizzazione della tabella dati, come fa Jarmo nel suo esempio:
riga = 0 -> tutte le righe
colonne: x e y
coordinates as matrix = dt1[0, {"x", "y"}];Re: Come faccio ad aggiungere dati da una tabella a un'altra tabella in base alla distanzaLa documentazione di VPTree potrebbe essere ottimizzata.
Tabella KD:

KDTable << K righe più vicine ha due modalità:
- predefinito: prende le posizioni di input come punti di partenza.
-> non adatto a noi.
- facoltativo: utilizzare una singola posizione come punto di partenza.
-> sì!
Calcolo questo punto come pos = Matrix ({:x,:y}) per ogni riga e lo fornisco come secondo argomento per le K righe più vicine
I valori restituiti sono vettori di righe e distanze. Con [1][1] , posso prima ottenere le righe , e poi la prima (e unica) voce.
Sfortunatamente, non esiste una modalità per fornire un set di punti di partenza come input.
Albero VP:
Per K Rows più vicine non esiste una vera e propria documentazione nello Scripting INdex, ma c'è un esempio proprio nella definizione di VPTree:

e c'è della documentazione nella guida in linea:


Sembrano le stesse 2 opzioni di KDTable.
Dall'esempio di @jthi si può vedere che VPTree consente una terza modalità, in cui un insieme di posizioni viene fornito come matrice.
Questo è un po' sorprendente, ma molto comodo 
tree = VPTree(m2);
{rows, distances} = tree << K Nearest Rows(1, m1);
dt1 << New Column("Nearest", Numeric, Ordinal, Values(rows));
Re: Come faccio ad aggiungere dati da una tabella a un'altra tabella in base alla distanzaVPtree << K Nearest Rows(1, matrix of coordinates);
Carino : ):)
Re: Come faccio ad aggiungere dati da una tabella a un'altra tabella in base alla distanzaUlteriori idee:
- desiderio correlato per 1D: aggiungere fuzzy join / asof merge / join per colonne che non hanno corrispondenze esatte
Ho appena aggiunto un commento per considerare le dimensioni superiori.
- Nei casi di applicazione reali, ci sono coordinate nominali aggiuntive come lotti, wafer, varianti. L'utente deve dividere i dati di conseguenza e impostare VPTree separati per ogni "variante". VPTree con groupBy sarà un logico passo successivo.
- D'altro canto, invece di usare semplicemente un valore vicino, l'utente potrebbe preferire interpolare i dati di input per ottenere valori più significativi. Raggruppa per - così utile!!! Che ne dici di Interpolate?