在 Spotfire 的同一列中匹配组(表达式)
matching for group (Expressions) in same column in Spotfire
关于我之前发布的问题:
我有一个新问题,下面是示例:
我要实现的新功能是,
- 正在搜索 下一个 最近的 TYPE=0 for TYPE=1
- 如果 TYPE=1 有最接近的 TYPE=0,则在新的计算列中将其标记为 'T',否则标记为 NULL
数据规则:
- Status 列按顺序包含 {1,2},null space 的默认值与其上方最后一个最近的 Status 值相同。
- Type列随机只包含0和1
输出应该是这样的:
我尝试过的解决方案:
If(([type]=1) and (first([type]) OVER (intersect(previous([type]),AllNext([status])))=0),"T",Null)
看起来不错,但是问题出在每个status组,比如第一个status=1组的最后一个TYPE=1(第5行),没有next nearest TYPE=0,所以判断将为空。但是根据代码,它是T! :(
有什么建议和想法吗?
多谢'!
PS:一些细节:
- 状态的第一个Type值为NULL
- 状态栏中的其他空值space可以如下填写,如果对表达有帮助:):
好的,这个真的测试了我的极限,我很好奇它是否会扩展。它适用于您的数据,前提是您有 NULL
。花了几个小时才弄明白。
- 插入计算列
RowId()
并将其命名为 RowNum
- 插入计算列
RankReal([status],"ties.method=first")
并将其命名为 Rank
- 插入计算列
If((first([status]) over (Previous([RowNum])) - First([status]) over ([RowNum]))=0,[Rank] - Max([RowNum]) OVER (Intersect([status],AllPrevious([RowNum]))))
并将其命名为 GroupOfTypes
- 插入计算列
If([type]>Min([type]) over (Intersect([GroupOfTypes],AllNext([RowNum]))),"T")
并将其命名为 Marking
。这是您真正关心的行。
结果
解释
RankReal([status],"ties.method=first")
这样做是为了根据一段状态创建一个伪行号。您会看到它根据状态按顺序排列。这是我对数据进行分组的方法的第一步。
If((first([status]) over (Previous([RowNum])) - First([status]) over ([RowNum]))=0,[Rank] - Max([RowNum]) OVER (Intersect([status],AllPrevious([RowNum]))))
第一部分 (first([status]) over (Previous([RowNum])) - First([status]) over ([RowNum]))=0
评估前一行的 [status]
列是否与当前行相同。如果是,它 returns 一个布尔 TRUE
值。如果它与前一行相同,我们就知道它属于同一个块/组,所以我们做一些数学运算,用整个块的相同值来标记这一列。即[Rank] - Max([RowNum]) OVER (Intersect([status],AllPrevious([RowNum])))
。因此,我们分组中的每一行都将等于相同的值。
If([type]>Min([type]) over (Intersect([GroupOfTypes],AllNext([RowNum]))),"T")
最后,我们根据行号评估 [type]
是否大于接下来所有行的最小值 [type]
。这将我们关注的数据限制在 [type] = 1
而没有实际过滤行的数据,而只在数据集中查看 forward。如果这是真的,我们用 T.
标记它
@ZAWD - 另一种解决方法。
步骤 1: 使用表达式 RowId()
创建了一个 RowID
步骤 2: 使用以下表达式创建了一个计算列 'Mark0'。这一步是为了查找当前类型不为0且其连续类型为0。
注意:该栏在后台运行。不必包含在table中。此外,100 是一些虚拟值,仅用于确保满足条件
If((Sum([type]) over ([RowID])!=0) and (Sum([type]) over (Next([RowID]))=0),100)
第 3 步: 使用以下表达式创建计算列 'Mark1'。这一步是查找当前类型不为0且其连续类型也不为0,并填充Mark0。
注意:此列在后台运行。不需要包含在table
If((Sum([type]) over ([RowID])!=0) and (Sum([type]) over (Next([RowID])) Is Not Null) and (first([Mark0]) over (allNext([RowID]))=100),100)
第 4 步: 最后,使用以下表达式创建 'final mark' 列,该表达式将 Mark0 和 Mark1 列中的 100 标记为 'T'
If(([Mark0]=100) or ([Mark1]=100),"T",null)
最终 Table:
我已经用您的数据以及不同的场景(例如 'type' 列中的三个连续 1 而不是两个)对此进行了测试,并且似乎工作正常。请测试一下,让我知道这是不是 stable.
关于我之前发布的问题:
我有一个新问题,下面是示例:
我要实现的新功能是,
- 正在搜索 下一个 最近的 TYPE=0 for TYPE=1
- 如果 TYPE=1 有最接近的 TYPE=0,则在新的计算列中将其标记为 'T',否则标记为 NULL
数据规则:
- Status 列按顺序包含 {1,2},null space 的默认值与其上方最后一个最近的 Status 值相同。
- Type列随机只包含0和1
输出应该是这样的:
我尝试过的解决方案:
If(([type]=1) and (first([type]) OVER (intersect(previous([type]),AllNext([status])))=0),"T",Null)
看起来不错,但是问题出在每个status组,比如第一个status=1组的最后一个TYPE=1(第5行),没有next nearest TYPE=0,所以判断将为空。但是根据代码,它是T! :(
有什么建议和想法吗? 多谢'! PS:一些细节:
- 状态的第一个Type值为NULL
- 状态栏中的其他空值space可以如下填写,如果对表达有帮助:):
好的,这个真的测试了我的极限,我很好奇它是否会扩展。它适用于您的数据,前提是您有 NULL
。花了几个小时才弄明白。
- 插入计算列
RowId()
并将其命名为RowNum
- 插入计算列
RankReal([status],"ties.method=first")
并将其命名为Rank
- 插入计算列
If((first([status]) over (Previous([RowNum])) - First([status]) over ([RowNum]))=0,[Rank] - Max([RowNum]) OVER (Intersect([status],AllPrevious([RowNum]))))
并将其命名为GroupOfTypes
- 插入计算列
If([type]>Min([type]) over (Intersect([GroupOfTypes],AllNext([RowNum]))),"T")
并将其命名为Marking
。这是您真正关心的行。
结果
解释
RankReal([status],"ties.method=first")
这样做是为了根据一段状态创建一个伪行号。您会看到它根据状态按顺序排列。这是我对数据进行分组的方法的第一步。
If((first([status]) over (Previous([RowNum])) - First([status]) over ([RowNum]))=0,[Rank] - Max([RowNum]) OVER (Intersect([status],AllPrevious([RowNum]))))
第一部分 (first([status]) over (Previous([RowNum])) - First([status]) over ([RowNum]))=0
评估前一行的 [status]
列是否与当前行相同。如果是,它 returns 一个布尔 TRUE
值。如果它与前一行相同,我们就知道它属于同一个块/组,所以我们做一些数学运算,用整个块的相同值来标记这一列。即[Rank] - Max([RowNum]) OVER (Intersect([status],AllPrevious([RowNum])))
。因此,我们分组中的每一行都将等于相同的值。
If([type]>Min([type]) over (Intersect([GroupOfTypes],AllNext([RowNum]))),"T")
最后,我们根据行号评估 [type]
是否大于接下来所有行的最小值 [type]
。这将我们关注的数据限制在 [type] = 1
而没有实际过滤行的数据,而只在数据集中查看 forward。如果这是真的,我们用 T.
@ZAWD - 另一种解决方法。
步骤 1: 使用表达式 RowId()
创建了一个 RowID步骤 2: 使用以下表达式创建了一个计算列 'Mark0'。这一步是为了查找当前类型不为0且其连续类型为0。
注意:该栏在后台运行。不必包含在table中。此外,100 是一些虚拟值,仅用于确保满足条件
If((Sum([type]) over ([RowID])!=0) and (Sum([type]) over (Next([RowID]))=0),100)
第 3 步: 使用以下表达式创建计算列 'Mark1'。这一步是查找当前类型不为0且其连续类型也不为0,并填充Mark0。
注意:此列在后台运行。不需要包含在table
If((Sum([type]) over ([RowID])!=0) and (Sum([type]) over (Next([RowID])) Is Not Null) and (first([Mark0]) over (allNext([RowID]))=100),100)
第 4 步: 最后,使用以下表达式创建 'final mark' 列,该表达式将 Mark0 和 Mark1 列中的 100 标记为 'T'
If(([Mark0]=100) or ([Mark1]=100),"T",null)
最终 Table: