Comment faire correspondre les valeurs de deux colonnes dont l'ordre peut différer ?Supposons que j'aie mesuré un défaut sur une plaquette à deux reprises et que je dispose des données des axes X et Y pour chaque défaut.
Certains défauts sont des défauts récurrents, ils ont des données d'axe très similaires (bien que pas exactement identiques), je leur attribuerais donc l'étiquette « répétition », tandis que d'autres défauts ne présentent aucune correspondance, je leur attribuerais donc l'étiquette « nouveau ».
Comment puis-je écrire une formule pour automatiser cela ? (c.-à-d. : formule pour créer automatiquement une colonne « juger en fonction de après »)
(Notez que pour un même défaut, les valeurs ne sont pas exactement identiques, mais très proches. De plus, un même défaut peut figurer sur des lignes différentes avant et après.)
| X-Avant |
Y-Avant |
X-Après |
Y-Après |
juger en fonction de après |
| -446659 |
888856 |
-446649 |
888852 |
Répéter |
| -445908 |
630775 |
-445899 |
630772 |
Répéter |
| -447462 |
301534 |
-446122 |
588199 |
nouveau |
| -140914 |
508425 |
-447456 |
301532 |
Répéter |
| |
|
-140907 |
508433 |
Répéter |
Modélisation statistique avancéeÉtudes de marché et de consommationFusion et nettoyage des donnéesRe : Comment faire correspondre les valeurs de deux colonnes alors que l'ordre peut être différentMerci pour la clarification.La clé de ce script est la compréhension de la fonction
dt << obtenir des lignes où()
Et puis en parcourant toutes les lignes qui ont des valeurs Avant X et Y valides.
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"
)
)
);
Compte tenu de votre estimation du nombre de lignes que votre table de données peut contenir, vous pouvez vous attendre à ce que le script prenne beaucoup de temps à traiter.
Mon utilisation de <= 100 unités comme distance considérée comme le même défaut n'est que ma conjecture.Je n'ai aucun moyen réel de définir cette valeur, étant donné que je ne connais pas la résolution de l'outil de mesure des défauts et votre capacité de résolution pas à pas.Mais, vous devriez être en mesure d'estimer la variabilité de l'outil et, à partir de là, de définir les unités de distance.
Re : Comment faire correspondre les valeurs de deux colonnes alors que l'ordre peut être différentSalut txnelson,
Merci pour votre réponse, j'ai essayé votre méthode. Cependant, il y a un problème.
Il semble que vous ne comparez que les données à la même ligne.
La situation réelle est :
Avant, il pouvait y avoir 500 défauts, soit 500 lignes. Pour après, il pourrait y avoir 1000 lignes.
Le même défaut peut se situer à la ligne 50 # dans la colonne avant et se situe à la ligne 121 dans la colonne après, vous ne le saurez pas.
Il est donc nécessaire de comparer les 1000 lignes d'après avec les 500 lignes d'avant pour correspondre à chaque défaut répété.
Le résultat de la correspondance peut être : 490 parmi 500 pourraient trouver une correspondance, 10 manquaient et les 500 autres sont de nouveaux additionneurs
Re : Comment faire correspondre les valeurs de deux colonnes alors que l'ordre peut être différentVoici une approche.I détermine la différence entre les deux points, puis applique la logique Nouveau/Répéter à la différence.Je crois que vous avez une erreur dans votre tableau de données, qui apparaît dans le nouveau calcul
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"
);
);