Cómo hacer coincidir los valores de dos columnas aunque el orden sea diferente.Supongamos que medí un defecto en una oblea dos veces y tengo datos de los ejes X e Y para cada defecto.
Algunos defectos son defectos repetidos, tienen datos de ejes muy similares (aunque no exactamente iguales), por lo que les pondría la etiqueta "repetido", mientras que algunos defectos no tienen coincidencia, por lo que les pondría la etiqueta "nuevo".
¿Cómo puedo escribir una fórmula para automatizar esto? (es decir: fórmula para crear automáticamente una columna que evalúe los resultados después de la evaluación).
(Tenga en cuenta que, para un mismo defecto, los valores no son exactamente iguales, sino muy similares. Además, un mismo defecto podría aparecer en filas diferentes antes y después).
| X-Antes |
Y-Antes |
X-Después |
Y-Después |
juzgar base en después |
| -446659 |
888856 |
-446649 |
888852 |
Repetir |
| -445908 |
630775 |
-445899 |
630772 |
Repetir |
| -447462 |
301534 |
-446122 |
588199 |
nuevo |
| -140914 |
508425 |
-447456 |
301532 |
Repetir |
| |
|
-140907 |
508433 |
Repetir |
Modelado estadístico avanzadoInvestigación de mercado y del consumidorCombinación y limpieza de datosRe: Cómo hacer coincidir los valores de dos columnas mientras que el orden podría ser diferenteGracias por la aclaración.La clave de este guión es la comprensión de la función.
dt << obtener filas donde()
Y luego recorrer todas las filas que tienen valores antes de X e Y válidos.
Names Default To Here( 1 );
dt = Current Data Table();
xFudge = Abs( Min( Col Min( :"x-before"n ), Col Min( :"x-after"n ) ) );
yFudge = Abs( Min( Col Min( :"y-before"n ), Col Min( :"y-after"n ) ) );
dt << New Column( "Repeat_New", character, set each value( "New" ) );
For( i = 1, i <= N Rows( dt ), i++,
If( Is Missing( :"x-before"n[i] + :"y-before"n[i] ) == 0,
Try(
:Repeat_New[dt << get rows where(
Sqrt(
((xFudge + :"x-before"n[i]) - (xFudge + :"x-after"n)) ^ 2 + ((yFudge
+:"y-before"n[i]) - (yFudge + :"y-after"n)) ^ 2
) < 100 & Row() >= i
)] = "Repeat"
)
)
);
Dada su estimación de cuántas filas puede tener su tabla de datos, puede esperar que el script tome una cantidad significativa de tiempo para procesarse.
Mi uso de <= 100 unidades como la distancia considerada como el mismo defecto, es solo mi suposición.No tengo una forma real de establecer ese valor, dado que no conozco la resolución de la herramienta de medición de defectos y su capacidad de resolución paso a paso.Pero debería poder estimar la variabilidad de la herramienta y, a partir de ahí, configurar las unidades de distancia.
Re: Cómo hacer coincidir los valores de dos columnas mientras que el orden podría ser diferenteHola txnelson,
Gracias por tu respuesta, probé tu método. Sin embargo, hay un problema.
Parece que solo compara datos en la misma fila.
La situación real es:
Antes podía haber 500 defectos, es decir, 500 filas. Para después, podría haber 1000 filas.
El mismo defecto puede ubicarse en la fila 50 # en la columna anterior y ubicarse en la fila 121 en la columna posterior, no lo sabrá.
Por lo tanto, es necesario comparar las 1000 filas posteriores con las 500 filas anteriores para que coincidan con todos los defectos repetidos.
El resultado de la coincidencia puede ser: 490 entre 500 pudieron encontrar una coincidencia, 10 faltaban y los otros 500 son nuevos sumadores
Re: Cómo hacer coincidir los valores de dos columnas mientras que el orden podría ser diferenteAquí hay un enfoque.Determina la diferencia entre los dos puntos y luego aplica la lógica Nuevo/Repetir a la diferencia.Creo que tiene un error en su tabla de datos, eso aparece en el nuevo cálculo
Names Default To Here( 1 );
dt = Current Data Table();
xFudge = Abs( Min( Col Min( :"x-before"n ), Col Min( :"x-after"n ) ) );
yFudge = Abs( Min( Col Min( :"y-before"n ), Col Min( :"y-after"n ) ) );
//dt << New Column( "diff" );
dt << New Column( "Repeat_New", character );
For Each Row(
diff = Sqrt(
((xFudge + :"x-before"n) - (xFudge + :"x-after"n)) ^ 2 + ((yFudge + :"y-before"n) - (yFudge +
:"y-after"n)) ^ 2
);
If( diff < 100 | isMissing(diff)
,
:Repeat_New = "Repeat";
,
:Repeat_New = "New"
);
);