【问题标题】:Calculated column based off values in another column in Spotfire基于 Spotfire 中另一列中的值计算的列
【发布时间】:2015-10-06 14:53:19
【问题描述】:

我刚开始使用 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 的行。

【问题讨论】:

    标签: spotfire


    【解决方案1】:

    编辑为了避免在[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 所在的每一行返回一个NA,您可以通过将First() 更改为Concatenate() 来观察这一点
    • If([pass] = "1", String([bin]), "NA") 确保我们[bin]NA 中记录值。如果没有这个,我们的结果将包含[bin] 的所有值——尝试删除If() 看看!
    • OVER Intersect([loc], [wafer], [x], [y]) 为这四列的每个唯一组合创建一个“节点”层次结构(参见下面链接的文档)。

    注意,根据您的数据大小,这可能是一个非常缓慢的表达式,因为 Intersect(...)。如果你发现刷新数据的时候计算时间比较长,可能用两列会有更好的结果:

    1. [ID] 就是 Concatenate([loc], [wafer], [x], [y])
    2. [Result] 是上面的答案,除了结尾看起来像 ... OVER [ID](我们不需要使用 Intersect(),因为我们只比较单个列)

    有关带有示例的 OVER 函数的文档,请查看位于 Advanced Custom Expressions 的 Spotfire 帮助文件。我知道这仍然不是完全可以理解的。 OVER 函数对大脑来说有点牵强 :)


    只是为您的第一次尝试添加一些上下文以及为什么它不起作用:

    由于您没有对 [bin] 的值进行任何计算,因此您可以使用以下情况进行简化:

    WHEN [pass] = "1" THEN [bin]
    

    当然,您拥有的表达式在[pass] != "1" 时没有返回任何值,因为您没有指定任何其他情况。要解决这个问题,你需要这样的东西:

    CASE
      WHEN [pass] = "1" THEN [bin]
      WHEN [pass] != "NA" THEN ...
      ELSE null
    END
    

    【讨论】:

    • 感谢所有的指点。这非常有帮助!因此,当我运行它时,它会将 bin 值添加到其中没有传递值的行中。我怎样才能让它忽略没有通过值的行?因此,例如它的输出如下:loc 晶圆 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 13
    • 我没有意识到这看起来很奇怪。基本上,第 4 行(不包括标题)的 newCol 值是 13 而不是 NA。
    • 明白了!我更新了答案以反映该要求:)
    • 太棒了。你帮了大忙!再次感谢!
    • @BrittanyEnfield 太好了,很高兴我能帮上忙 :) 你介意将问题标记为已解决吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-23
    • 2021-07-15
    • 1970-01-01
    • 1970-01-01
    • 2013-05-04
    • 1970-01-01
    相关资源
    最近更新 更多