基于 Spotfire 中另一列中的值计算的列
Calculated column based off values in another column in Spotfire
我刚开始使用 Spotfire,在弄清楚如何创建特定的计算列时遇到了一些困难。我很确定我需要使用 OVER 函数,但我还没有完全弄明白,而且互联网上几乎没有文档或示例。
这是我正在处理的数据示例:
loc wafer x y pass bin
T25 10 2 37 1 13
T25 10 2 37 2 6
CMI 10 2 37 NA 13
T25 10 2 37 NA 13
T25 10 2 38 1 13
T25 10 2 38 2 13
CMI 10 2 38 NA 13
T25 10 2 38 NA 13
T25 10 2 70 1 1
T25 10 2 70 2 4
CMI 10 2 70 NA 1
CMI 10 2 70 NA 1
T25 10 2 70 NA 1
T25 10 2 70 NA 1
我尝试创建的列将基于传递值。因此,对于每个位置、晶片和 x-y 坐标,每当 pass=1 时,我想将 bin 值复制到该行的新列中。我还希望将相同的 pass=1 bin 值复制到匹配位置、晶圆、x-y 坐标,其中 pass 不是 NA。这是我想看到的:
loc wafer x y pass bin newCol
T25 10 2 37 1 13 13
T25 10 2 37 2 6 13
CMI 10 2 37 NA 13 NA
T25 10 2 37 NA 13 NA
T25 10 2 38 1 13 13
T25 10 2 38 2 13 13
CMI 10 2 38 NA 13 NA
T25 10 2 38 NA 13 NA
T25 10 2 70 1 1 1
T25 10 2 70 2 4 1
CMI 10 2 70 NA 1 NA
CMI 10 2 70 NA 1 NA
T25 10 2 70 NA 1 NA
T25 10 2 70 NA 1 NA
我现在的表情如下:
CASE
WHEN [pass] = "1" THEN Concatenate([bin]) OVER ([location],[wafer],[x],[y])
END
它将 bin 复制到 pass=1 的任何行,但不是 pass=2 的行。
编辑 以避免在 [pass] = "NA"
时具有 [bin]
值,将整个事物包围在 If()
中,如下所示:
If([pass]!="NA", First(If([pass]="1",String([bin]),"NA")) OVER (Intersect([loc],[wafer],[x],[y])), "NA")
我认为您的方向是正确的,但这并不是一个简单的表达方式!这是我想出的:
First(If([pass]="1",String([bin]),"NA")) OVER (Intersect([loc],[wafer],[x],[y]))
所以让我们分解一下:
选择 First(...)
是因为我们想要第一个结果!内联 If()
将为 [pass] != 1
中的每一行 return 一个 NA,您可以通过将 First()
更改为 Concatenate()
If([pass] = "1", String([bin]), "NA")
确保我们 仅 记录 [bin]
或 NA 中的值。如果没有这个,我们的结果将包含 [bin]
的所有值——尝试删除 If()
并查看!
OVER Intersect([loc], [wafer], [x], [y])
为这四列的每个唯一组合创建一个 "nodes" 的层次结构(参见下面链接的文档)。
注意 根据数据的大小,由于 Intersect(...)
,这可能是一个非常慢的表达式。如果你发现刷新数据的时候计算时间比较长,用两列可能会有更好的结果:
[ID]
就是 Concatenate([loc], [wafer], [x], [y])
[Result]
就是上面的答案,除了结尾看起来像 ... OVER [ID]
(我们不需要使用 Intersect()
因为我们只比较单个列)
有关带有示例的 OVER 函数的文档,请查看位于 Advanced Custom Expressions 的 Spotfire 帮助文件。我知道这还不是完全可以理解的; OVER函数对大脑来说有点吃力:)
只是为您的第一次尝试添加一些背景信息以及它为什么不起作用:
因为您没有对 [bin]
的值进行任何计算,您可以使用以下情况进行简化:
WHEN [pass] = "1" THEN [bin]
当然,当 [pass] != "1"
时,您的表达式没有 returning 任何值,因为您没有指定任何其他情况。要解决这个问题,您需要这样的东西:
CASE
WHEN [pass] = "1" THEN [bin]
WHEN [pass] != "NA" THEN ...
ELSE null
END
我刚开始使用 Spotfire,在弄清楚如何创建特定的计算列时遇到了一些困难。我很确定我需要使用 OVER 函数,但我还没有完全弄明白,而且互联网上几乎没有文档或示例。
这是我正在处理的数据示例:
loc wafer x y pass bin
T25 10 2 37 1 13
T25 10 2 37 2 6
CMI 10 2 37 NA 13
T25 10 2 37 NA 13
T25 10 2 38 1 13
T25 10 2 38 2 13
CMI 10 2 38 NA 13
T25 10 2 38 NA 13
T25 10 2 70 1 1
T25 10 2 70 2 4
CMI 10 2 70 NA 1
CMI 10 2 70 NA 1
T25 10 2 70 NA 1
T25 10 2 70 NA 1
我尝试创建的列将基于传递值。因此,对于每个位置、晶片和 x-y 坐标,每当 pass=1 时,我想将 bin 值复制到该行的新列中。我还希望将相同的 pass=1 bin 值复制到匹配位置、晶圆、x-y 坐标,其中 pass 不是 NA。这是我想看到的:
loc wafer x y pass bin newCol
T25 10 2 37 1 13 13
T25 10 2 37 2 6 13
CMI 10 2 37 NA 13 NA
T25 10 2 37 NA 13 NA
T25 10 2 38 1 13 13
T25 10 2 38 2 13 13
CMI 10 2 38 NA 13 NA
T25 10 2 38 NA 13 NA
T25 10 2 70 1 1 1
T25 10 2 70 2 4 1
CMI 10 2 70 NA 1 NA
CMI 10 2 70 NA 1 NA
T25 10 2 70 NA 1 NA
T25 10 2 70 NA 1 NA
我现在的表情如下:
CASE
WHEN [pass] = "1" THEN Concatenate([bin]) OVER ([location],[wafer],[x],[y])
END
它将 bin 复制到 pass=1 的任何行,但不是 pass=2 的行。
编辑 以避免在 [pass] = "NA"
时具有 [bin]
值,将整个事物包围在 If()
中,如下所示:
If([pass]!="NA", First(If([pass]="1",String([bin]),"NA")) OVER (Intersect([loc],[wafer],[x],[y])), "NA")
我认为您的方向是正确的,但这并不是一个简单的表达方式!这是我想出的:
First(If([pass]="1",String([bin]),"NA")) OVER (Intersect([loc],[wafer],[x],[y]))
所以让我们分解一下:
-
选择
First(...)
是因为我们想要第一个结果!内联If()
将为[pass] != 1
中的每一行 return 一个 NA,您可以通过将First()
更改为Concatenate()
If([pass] = "1", String([bin]), "NA")
确保我们 仅 记录[bin]
或 NA 中的值。如果没有这个,我们的结果将包含[bin]
的所有值——尝试删除If()
并查看!OVER Intersect([loc], [wafer], [x], [y])
为这四列的每个唯一组合创建一个 "nodes" 的层次结构(参见下面链接的文档)。
注意 根据数据的大小,由于 Intersect(...)
,这可能是一个非常慢的表达式。如果你发现刷新数据的时候计算时间比较长,用两列可能会有更好的结果:
[ID]
就是Concatenate([loc], [wafer], [x], [y])
[Result]
就是上面的答案,除了结尾看起来像... OVER [ID]
(我们不需要使用Intersect()
因为我们只比较单个列)
有关带有示例的 OVER 函数的文档,请查看位于 Advanced Custom Expressions 的 Spotfire 帮助文件。我知道这还不是完全可以理解的; OVER函数对大脑来说有点吃力:)
只是为您的第一次尝试添加一些背景信息以及它为什么不起作用:
因为您没有对 [bin]
的值进行任何计算,您可以使用以下情况进行简化:
WHEN [pass] = "1" THEN [bin]
当然,当 [pass] != "1"
时,您的表达式没有 returning 任何值,因为您没有指定任何其他情况。要解决这个问题,您需要这样的东西:
CASE
WHEN [pass] = "1" THEN [bin]
WHEN [pass] != "NA" THEN ...
ELSE null
END