unire le tabelle in base alle colonne corrispondenti e alla colonna corrispondente più vicinaCIAO,
Voglio unire due tavoli.
Ho una corrispondenza completa su due colonne e la corrispondenza più vicina sulle altre due colonne.
Ogni tabella con un numero diverso di righe.
riferimento ordinato= 108 righe
scansione ordinata = 193 righe
Voglio che la tabella finale contenga tutte le righe della tabella di riferimento, ovvero 108 righe, + i dati corrispondenti della seconda tabella.
colonne di corrispondenza esatta:
1. Riferimento riga = Scansione riga
2. Riferimento Col = Scansione Col
colonne corrispondenti più vicine:
1. Riferimento coordinate X = Scansione coordinate X
2. Riferimento coordinate Y = Scansione coordinate Y
Se possibile, voglio controllare il valore di prossimità, come l'area di ricerca.
Ho provato altri suggerimenti nel forum: unione parziale e righe più vicine, ma non ho ottenuto i risultati desiderati.
apprezzerei qualsiasi aiuto.
Automazione e scriptingAnalisi e modellazione dei dati di baseFusione e pulizia dei datiRe: unisci tabelle in base alle colonne corrispondenti e alla colonna corrispondente più vicinaPuoi fornirci un esempio dei risultati che desideri ottenere?
Re: unisci tabelle in base alle colonne corrispondenti e alla colonna corrispondente più vicinaCIAO,
questo è un esempio dei risultati che voglio ottenere.
per le righe 14, 15 -
Se è presente un'opzione per impostare l'area di ricerca, ad esempio 30, queste righe non presenteranno corrispondenze e mostreranno solo i dati della tabella di riferimento.
ma se prendiamo il risultato più vicino, indipendentemente dall'area di ricerca, allora vedremo i risultati come nella tabella fornita.
Spero che sia chiaro
Re: unisci tabelle in base alle colonne corrispondenti e alla colonna corrispondente più vicinaQuesto potrebbe dare qualche idea
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: unisci tabelle in base alle colonne corrispondenti e alla colonna corrispondente più vicinaGrazie per la rapida risposta.
funziona benissimo.
Ho provato ad aggiungere un'istruzione: se :Distanza <30 non mostrare i risultati, solo il riferimento.
ma si è concluso senza i risultati in cui la distanza >30.
c'è un'opzione per aggiungere questa condizione?
Re: unisci tabelle in base alle colonne corrispondenti e alla colonna corrispondente più vicinaCome hai provato ad aggiungerlo?
Lo script seleziona prima le righe con le distanze minime per ciascuno dei gruppi e le righe che non potevano essere unite
dt_res << Select Where(
:Distance == Col Min(:Distance, :Col_Reference, :Row_Reference, :ID_Reference)
| Is Missing(:ID_SCAN)
);
Quindi invertirà la selezione e rimuoverà le righe invertite
dt_res << Invert Row Selection;
dt_res << Delete Rows;
Puoi modificare la condizione di selezione in modo che funzioni senza inversione oppure pensare a come prendere in considerazione l'inversione con il tuo limite di distanza.