Comment ajouter des données d'une table à une autre table en fonction de la distanceJ'ai deux tableaux de données pour deux ensembles de mesures sur la plaquette. Il y a quatre colonnes dans chaque tableau, X, Y représentant l'emplacement des mesures, et deux colonnes de données de mesure pour chaque tableau. les mesures ne sont pas collectées à partir des mêmes positions exactes (X, Y) de la plaquette. Je voudrais mettre à jour (ajouter des colonnes supplémentaires de l'autre tableau) l'un ou l'autre des tableaux en fonction de la proximité des emplacements de mesure. Pour être plus clair, j'aimerais avoir un tableau combiné (total de 8 colonnes) basé sur la correspondance de X1, Y1 avec le point le plus proche sur X2 et Y2. Veuillez consulter l'image que j'ai téléchargée. Je sais que la fonction Distance peut probablement être utilisée pour créer une matrice de toutes les distances à partir d'un X, Y donné, mais je ne sais pas comment écrire le code jsl pour calculer le tableau mis à jour pour moi.
Automatisation et scriptsFusion et nettoyage des donnéesFenêtresRé: Comment ajouter des données d'une table à une autre table en fonction de la distanceDécouvrez les fonctions suivantes en plus de la distance
Ajoutez ensuite un index basé sur les lignes à votre table « principale », utilisez l’un d’entre eux pour trouver l’index le plus proche (essentiellement une ligne), ajoutez-le à votre deuxième table, puis utilisez enfin la mise à jour/jointure pour combiner les tables.
Ré: Comment ajouter des données d'une table à une autre table en fonction de la distanceD'après les liens de @jthi , je pense que cela fait ce que vous voulez
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
Ré: Comment ajouter des données d'une table à une autre table en fonction de la distanceSalut Steve et Jarmo,
Merci pour les suggestions. Le script était également utile. Cependant, lorsque je l'exécute, je ne pense pas qu'il trouve la distance la plus proche. Par exemple, dans la première ligne du tableau 1, il y a des correspondances avec la ligne 8 (distance d'environ 1,37) du tableau 2, mais il existe de nombreux points beaucoup plus proches tels que la ligne numéro 1 (distance de 0,69) (la distance doit être sqrt[(x-x0)^2+(y-y0)^2])

Ré: Comment ajouter des données d'une table à une autre table en fonction de la distanceJe pense que j'ai mélangé les tableaux de données à la fin du script, essayez ceci :
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>
Ré: Comment ajouter des données d'une table à une autre table en fonction de la distanceI 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>Ré: Comment ajouter des données d'une table à une autre table en fonction de la distancedt1=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 ) )
)}
)
)
);

Ré: Comment ajouter des données d'une table à une autre table en fonction de la distanceMerci d'avoir nettoyé ça pour moi @hogi !
Question, pouvez-vous m’expliquer ce que fait cette ligne de code ?
dt1 << new column("row_2",Nominal, set each value(pos = Matrix({:x, :y});(MD2 << K nearest rows( 1, pos))[1][1]));
Remercier!
Ré: Comment ajouter des données d'une table à une autre table en fonction de la distanceMerci Hogi,
Cela fonctionne comme un champion, cependant, j'avais exactement la même question que Steve :
Pouvez-vous expliquer la ligne
dt1 << new column("row_2",Nominal, set each value(pos = Matrix({:x, :y});(MD2 << K nearest rows( 1, pos))[1][1]));De plus, lorsque j'exécute ma version (en lisant les tableaux avec quatre colonnes (x, y, données 1, données 2) sur le tableau 1 et (x2, y2, données 3, données 4)), j'obtiens l'alerte ci-dessous. Je pense que c'est contrarié parce que le tableau 1 et le tableau 2 ont plus de deux colonnes (x, y) qui ne sont pas dans la matrice. Mais si vous expliquez la ligne, je pense que je peux comprendre le reste ! Merci pour l'aide

Ré: Comment ajouter des données d'une table à une autre table en fonction de la distanceSalut @spinup
Je pense que le problème est que mon code suppose que vous n'avez que les valeurs x et Y dans le tableau. Si vous commencez avec vos tables qui ont des colonnes numériques supplémentaires, alors k voisins les plus proches essaient de trouver le point le plus proche pour X, Y, A, B par rapport à X, Y, C, D.
Je pense que c'est pourquoi les codes @hogi fonctionnent si bien s'ils ne regardent que X et Y.
Si vous avez créé les colonnes non X/Y en tant que caractères et exécuté mon deuxième code, cela fonctionnerait, il vous suffirait de les redéfinir en caractères numériques une fois que vous les avez jointes.
Ré: Comment ajouter des données d'une table à une autre table en fonction de la distanceC'est quelque chose comme ça que je finis habituellement avec
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 Les lignes les plus proches peuvent être effectuées dans le mauvais sens car je n'ai pas vérifié les résultats
Ré: Comment ajouter des données d'une table à une autre table en fonction de la distancePour obtenir la matrice avec les coordonnées, vous pouvez utiliser l'indice de table de données, comme le fait Jarmo dans son exemple :
ligne = 0 -> toutes les lignes
colonnes : x et y
coordinates as matrix = dt1[0, {"x", "y"}];Ré: Comment ajouter des données d'une table à une autre table en fonction de la distanceLa documentation de VPTree pourrait être optimisée.
Tableau KD :

KDTable << K lignes les plus proches a deux modes :
- par défaut : prendre les positions d'entrée comme points de départ.
-> ne nous convient pas.
- facultatif : utiliser une seule position comme point de départ.
-> oui !
Je calcule ce point comme pos = Matrix ({:x,:y}) pour chaque ligne et le fournis comme deuxième argument pour K lignes les plus proches
Les valeurs de retour sont des vecteurs de lignes et de distances. Avec [1][1] , je peux d'abord obtenir les lignes , puis la première (et unique) entrée.
Malheureusement, il n’existe aucun mode permettant de fournir un ensemble de points de départ en entrée.
Arbre VPT :
Pour les K lignes les plus proches, il n'y a pas de véritable documentation dans l'index de script, mais il y a un exemple directement dans la définition de VPTree :

et il y a de la documentation dans l'aide en ligne :


cela ressemble aux 2 mêmes options que pour KDTable.
À partir de l'exemple de @jthi , vous pouvez voir que VPTree permet un troisième mode, où un ensemble de positions est fourni sous forme de matrice.
C'est un peu surprenant, mais très pratique 
tree = VPTree(m2);
{rows, distances} = tree << K Nearest Rows(1, m1);
dt1 << New Column("Nearest", Numeric, Ordinal, Values(rows));
Ré: Comment ajouter des données d'une table à une autre table en fonction de la distanceVPtree << K Nearest Rows(1, matrix of coordinates);
bon : ):)
Ré: Comment ajouter des données d'une table à une autre table en fonction de la distanceAutres idées :
- souhait lié à 1D : ajouter une jointure floue / une fusion asof / une jointure par colonnes qui n'ont pas de correspondance exacte
Je viens d'ajouter un commentaire pour considérer les dimensions supérieures.
- Dans les cas d'application réels, il existe des coordonnées nominales supplémentaires telles que des lots, des wafers, des variantes. L'utilisateur doit diviser les données en conséquence et configurer des VPTrees distincts pour chaque « variante ». VPTree avec groupBy sera une étape logique suivante.
- D'un autre côté, au lieu d'utiliser simplement une valeur voisine, l'utilisateur peut préférer interpoler les données d'entrée pour obtenir des valeurs plus significatives. Grouper par - tellement utile !!! Que diriez-vous d'Interpoler ?