Unir tablas en función de las columnas coincidentes y la columna de coincidencia más cercanaHola,
Quiero unir dos mesas.
Tengo una coincidencia completa en dos columnas y una coincidencia más cercana en otras dos columnas.
Cada tabla con diferente número de filas.
referencia ordenada= 108 filas
escaneo ordenado = 193 filas
Quiero que la tabla final tenga todas las filas de la tabla de referencia, 108 filas, más los datos coincidentes de la segunda tabla.
columnas de coincidencia exacta:
1. Referencia de fila = Escaneo de fila
2. Referencia de columna = Escaneo de columna
columnas de coincidencia más cercana:
1. Referencia de coordenadas X = Escaneo de coordenadas X
2. Referencia de coordenadas Y = Escaneo de coordenadas Y
Si es posible, quiero controlar el valor de aproximación, como el área de búsqueda.
Probé otras sugerencias en el foro: fusión difusa y filas más cercanas, pero no obtuve los resultados que quería.
Agradecería cualquier ayuda.
Automatización y scriptingAnálisis y modelado de datos básicosCombinación y limpieza de datosRe: unir tablas en función de las columnas coincidentes y la columna de coincidencia más cercana¿Puede proporcionarnos un ejemplo de los resultados que desea?
Re: unir tablas en función de las columnas coincidentes y la columna de coincidencia más cercanaHola,
Este es un ejemplo de los resultados que quiero.
para las filas 14, 15 -
Si hay una opción para establecer el área de búsqueda, por ejemplo 30, estas filas no tendrán coincidencias y solo mostrarán los datos de la tabla de referencia.
pero si tomamos el resultado más cercano independientemente del área de búsqueda, veremos los resultados como en la tabla proporcionada.
Espero que quede claro
Re: unir tablas en función de las columnas coincidentes y la columna de coincidencia más cercanaEsto podría dar alguna 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: unir tablas en función de las columnas coincidentes y la columna de coincidencia más cercanaGracias por la rápida respuesta.
Esto funciona muy bien.
Intenté agregar una declaración: si: Distancia <30 no muestre los resultados, solo la referencia.
pero terminó sin los resultados donde la distancia >30.
¿Existe alguna opción para agregar esta condición?
Re: unir tablas en función de las columnas coincidentes y la columna de coincidencia más cercana¿Cómo intentaste agregarlo?
El script primero selecciona las filas con las distancias mínimas para cada uno de los grupos y las filas que no se pudieron unir.
dt_res << Select Where(
:Distance == Col Min(:Distance, :Col_Reference, :Row_Reference, :ID_Reference)
| Is Missing(:ID_SCAN)
);
Luego invertirá la selección y eliminará esas filas invertidas.
dt_res << Invert Row Selection;
dt_res << Delete Rows;
Puede modificar la condición de selección para que funcione sin inversión o pensar cómo tomaría en cuenta la inversión con su límite de distancia.