如何匹配两列的值,即使顺序可能不同假设我对晶圆的缺陷进行了两次测量,并获得了每个缺陷的 X、Y 轴数据。
有些缺陷是重复缺陷,它们的轴数据非常相似(虽然不完全相同),所以我给它们贴上“重复”标签;而有些缺陷没有匹配项,所以我给它们贴上“新”标签。
如何编写一个公式来自动完成此操作?(例如:使用公式自动创建“基于之后结果的判断”列)
(请注意,对于同一缺陷,数值并不完全相同,只是非常接近。而且,同一缺陷在处理前后可能位于不同的行。)
| X之前 |
Y-之前 |
X-之后 |
Y-之后 |
法官根据之后的情况做出判断 |
| -446659 |
888856 |
-446649 |
888852 |
重复 |
| -445908 |
630775 |
-445899 |
630772 |
重复 |
| -447462 |
301534 |
-446122 |
588199 |
新的 |
| -140914 |
508425 |
-447456 |
301532 |
重复 |
| |
|
-140907 |
508433 |
重复 |
高级统计建模消费者和市场研究数据融合与清理回复:如何在顺序可能不同的情况下匹配两列的值谢谢你的澄清。这个脚本的关键是对函数的理解
dt << 获取行 where()
然后遍历所有具有有效 Before X 和 Y 值的行。
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"
)
)
);
根据您对数据表可能有多少行的估计,您可以预期脚本需要花费大量时间来处理。
我使用 <= 100 个单位作为被认为是相同缺陷的距离,这只是我的猜测。我没有真正的方法来设置该值,因为我不知道缺陷测量工具的分辨率和您的步进分辨率能力。但是,您应该能够估计工具的可变性并从中设置距离单位。
回复:如何在顺序可能不同的情况下匹配两列的值嗨 txnelson,
谢谢你的回复,我试过你的方法。 但是,有一个问题。
看来您只比较同一行的数据。
真实情况是:
对于之前,可能有 500 个缺陷,即 500 行。 之后,可能有 1000 行。
同样的缺陷可能位于前列的第 50#行,而后列位于第 121 行,您不会知道。
因此,有必要将之后的所有 1000 行与之前的所有 500 行进行比较,以匹配每个重复缺陷。
匹配结果可能是:500个匹配到490个,10个匹配失败,另外500个是新加法器
回复:如何在顺序可能不同的情况下匹配两列的值这是一种方法。我确定两点之间的差异,然后将新建/重复逻辑应用于差异。我相信你的数据表中有一个错误,它出现在新的计算中
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"
);
);