Wie kann man Werte aus zwei Spalten abgleichen, auch wenn die Reihenfolge unterschiedlich sein kann?Angenommen, ich habe einen Defekt an einem Wafer zweimal gemessen und habe für jeden Defekt Daten auf der X- und Y-Achse.
Bei einigen Defekten handelt es sich um wiederkehrende Defekte, da sie sehr ähnliche Achsendaten aufweisen (wenn auch nicht exakt die gleichen), daher würde ich sie mit dem Tag "wiederholt" kennzeichnen. Bei anderen Defekten hingegen gibt es keine Übereinstimmung, daher würde ich sie mit dem Tag "neu" kennzeichnen.
Wie schreibe ich eine Formel, die das automatisch erledigt? (z. B. eine Formel, die die Spalte „Bewertung basierend auf nach“ automatisch erstellt)
(Bitte beachten Sie, dass die Werte für denselben Defekt nicht exakt gleich, sondern nur sehr nahe beieinander liegen. Derselbe Defekt kann sich in der Vorher- und Nachher-Betrachtung in unterschiedlichen Zeilen befinden.)
| X-Vorher |
Y-Vorher |
X-Nach |
Y-Nach |
Richterbasis nach |
| -446659 |
888856 |
-446649 |
888852 |
Wiederholen |
| -445908 |
630775 |
-445899 |
630772 |
Wiederholen |
| -447462 |
301534 |
-446122 |
588199 |
neu |
| -140914 |
508425 |
-447456 |
301532 |
Wiederholen |
| |
|
-140907 |
508433 |
Wiederholen |
Fortgeschrittene statistische ModellierungVerbraucher- und MarktforschungDatenzusammenführung und -bereinigungBetreff: Wie man Werte für zwei Spalten abgleicht, obwohl die Reihenfolge unterschiedlich sein kannDanke für die Abklärung.Der Schlüssel zu diesem Skript ist das Verständnis der Funktion
dt << Zeilen abrufen wo()
Und dann alle Zeilen durchlaufen, die gültige Before X- und Y-Werte haben.
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"
)
)
);
Angesichts Ihrer Schätzung, wie viele Zeilen Ihre Datentabelle haben könnte, können Sie damit rechnen, dass die Verarbeitung des Skripts viel Zeit in Anspruch nimmt.
Meine Verwendung von <= 100 Einheiten als Entfernung, die als derselbe Fehler angesehen wird, ist nur meine Vermutung.Ich habe keine wirkliche Möglichkeit, diesen Wert einzustellen, da ich die Auflösung des Fehlermesswerkzeugs und die Auflösungsfähigkeit Ihres Steppers nicht kenne.Sie sollten jedoch in der Lage sein, die Werkzeugvariabilität abzuschätzen und daraus die Entfernungseinheiten einzustellen.
Betreff: Wie man Werte für zwei Spalten abgleicht, obwohl die Reihenfolge unterschiedlich sein kannHallo Txnelson,
Danke für deine Antwort, ich habe deine Methode ausprobiert. Es gibt jedoch ein Problem.
Es scheint, dass Sie nur Daten in derselben Zeile vergleichen.
Die reale Situation ist:
Denn vorher konnte es 500 Fehler, also 500 Zeilen geben. Für danach könnten es 1000 Zeilen sein.
Derselbe Fehler befindet sich möglicherweise in Zeile 50 # in der Vorspalte und in Zeile 121 in der Nachspalte, Sie werden es nicht wissen.
Daher ist es notwendig, alle 1000 Reihen von „Nachher“ mit allen 500 Reihen von „Vorher“ zu vergleichen, um jeden Wiederholungsfehler abzugleichen.
Das Übereinstimmungsergebnis kann lauten: 490 von 500 konnten eine Übereinstimmung finden, 10 fehlten und die anderen 500 sind Neuzugänge
Betreff: Wie man Werte für zwei Spalten abgleicht, obwohl die Reihenfolge unterschiedlich sein kannHier ist ein Ansatz.Ich bestimme die Differenz zwischen den beiden Punkten und wende dann die Neu/Wiederholen-Logik auf die Differenz an.Ich glaube, Sie haben einen Fehler in Ihrer Datentabelle, der in der neuen Berechnung auftaucht
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"
);
);