joindre des tables en fonction des colonnes correspondantes et de la colonne de correspondance la plus procheSalut,
Je souhaite joindre deux tables.
J'ai une correspondance complète sur deux colonnes et la correspondance la plus proche sur deux autres colonnes.
Chaque table avec un nombre différent de lignes.
référence triée = 108 lignes
scan trié = 193 lignes
Je veux que la table finale contienne toutes les lignes de la table de référence, 108 lignes, + les données correspondantes de la deuxième table.
colonnes de correspondance exacte :
1. Référence de ligne = Analyse de ligne
2. Référence Col = Col Scan
colonnes de correspondance la plus proche :
1. Référence des coordonnées X = Scan des coordonnées X
2. Référence des coordonnées Y = Scan des coordonnées Y
Si possible, je souhaite contrôler la valeur de proximité, comme la zone de recherche.
J'ai essayé d'autres suggestions dans le forum : fusion floue et lignes les plus proches, mais je n'ai pas obtenu les résultats souhaités.
J'apprécierais toute aide.
Automatisation et scriptsAnalyse et modélisation de données de baseFusion et nettoyage des donnéesRe: joindre des tables en fonction des colonnes correspondantes et de la colonne de correspondance la plus prochePouvez-vous fournir un exemple des résultats souhaités ?
Re: joindre des tables en fonction des colonnes correspondantes et de la colonne de correspondance la plus procheSalut,
Voici un exemple de résultats que je souhaite.
pour les rangées 14, 15 -
s'il existe une option pour définir la zone de recherche, par exemple 30, ces lignes seront sans correspondance et afficheront uniquement les données de la table de référence.
mais si nous prenons le résultat le plus proche quelle que soit la zone de recherche, nous verrons les résultats comme dans le tableau fourni.
j'espère que c'est clair
Re: joindre des tables en fonction des colonnes correspondantes et de la colonne de correspondance la plus procheCela pourrait donner une idée
Names Default To Here(1);
dt_scan = Open("$DOWNLOADS/scan sorted.jmp");
dt_ref = Open("$DOWNLOADS/reference sorted.jmp");
dt_scan << clear select << Clear Column Selection;
dt_ref << clear select << Clear Column Selection;
dt_res = dt_ref << Join(
With(dt_scan),
By Matching Columns(:Col_Reference = :Col_Scan, :Row_Reference = :Row_Scan),
Drop multiples(0, 0),
Include Nonmatches(1, 0),
Preserve main table order(1),
Output Table("Join of reference sorted with scan sorted")
);
dt_res << New Column("Distance", Numeric, Continuous, Formula(
Sqrt(
(:X_Coordinates_Scan - :X_Coordinates_Reference)^2
+
(:Y_Coordinates_Scan - :Y_Coordinates_Reference)^2
);
));
dt_res << Select Where(
:Distance == Col Min(:Distance, :Col_Reference, :Row_Reference, :ID_Reference)
| Is Missing(:ID_SCAN)
);
dt_res << Invert Row Selection;
dt_res << Delete Rows;Re: joindre des tables en fonction des colonnes correspondantes et de la colonne de correspondance la plus prochemerci pour la rediffusion rapide.
ça marche très bien.
j'ai essayé d'ajouter une déclaration - si : Distance <30 ne pas afficher les résultats, uniquement la référence.
mais s'est terminé sans résultats où la distance >30.
existe-t-il une option pour ajouter cette condition ?
Re: joindre des tables en fonction des colonnes correspondantes et de la colonne de correspondance la plus procheComment avez-vous essayé de l'ajouter ?
Le script sélectionne d'abord les lignes avec les distances minimales pour chacun des groupes et des lignes qui n'ont pas pu être jointes
dt_res << Select Where(
:Distance == Col Min(:Distance, :Col_Reference, :Row_Reference, :ID_Reference)
| Is Missing(:ID_SCAN)
);
Ensuite, il inversera la sélection et supprimera ces lignes inversées
dt_res << Invert Row Selection;
dt_res << Delete Rows;
Vous pouvez soit modifier la condition de sélection pour qu'elle fonctionne sans inverse, soit réfléchir à la manière dont vous prendriez en compte l'inversion avec votre limite de distance.