希望根据其他列的某些模式生成两列大家好,
我希望根据其他两列(“必需的列 1”和“必需的列 2”)中的模式生成两个新列。 请参阅附图 -

有什么帮助/建议吗?
谢谢。
质量和工艺工程回复:希望根据其他列的某些模式生成两列谢谢@jthi以获得很好的解释。
回复:希望根据其他列的某些模式生成两列1.也许这张图片解释了为什么第一个想法行不通(如果我没记错的话,第二个解决方案依赖于此,如果你计算。 + 1这将是。 

我确实从 If 语句中进行了不同的比较,并从中创建了公式,这样就可以更容易地看到什么返回 True 以及何时返回 True。
您很可能通过稍微修改比较来获得第一个解决方案(缺少(:开始结束) & Lag(:StartEnd) != "结束" | :StartEnd == "结束", val += 1 )。 但通过此更改,您还必须对第二个比较进行小更改(添加 Row() != Col Max(Row()) 检查)。
2. 想法Row() == Col Max(Row()) & :StartEnd == "开始"只是为了检查我们是否位于表的最后一行并且 :StartEnd 值为“Start”,我们不会根据之前的 if 语句将该值设置为 1。 Row() 将告诉您行号,而 Col Max(Row()) 将返回数据表中的最大行号。 可能有点不必要的检查,因为它是表的最后一行(就像后面带有开始/结束的行),但由于它在结果列中,我确实实现了它们。
最后一个 if-else 的总体思路如下:
1. Lag(:StartEnd) == "End" -> 这是对 End 计数后一般的“停止”
2. Row() == Col Max(Row()) & :StartEnd == "Start" -> 防止在最后一行为 Start 时返回 1
3. :StartEnd == "Start" & Lag(:StartEnd, -1) == "End" -> 防止在 Start 和 End 之间没有行的情况下返回 1 和 2
您可以通过稍微移动一些比较来仅使用一个 if 进行多次比较(这似乎返回与 Req1 相同的结果):
If(
Row() == 1, val = .,
Row() != Col Max(Row()) & :StartEnd == "Start" & Lag(:StartEnd, -1) != "End", val = 1,
Is Missing(:StartEnd) & Lag(:StartEnd) != "End" | :StartEnd == "End", val += 1,
val =.
)
希望解释不要太混乱
回复:希望根据其他列的某些模式生成两列大家好,
还有另一个查询,实际上是两个 -
1. 如果我在单个“If”语句中添加多个条件与使用单个条件添加多个“If”语句有什么区别。 请参阅附图 - 。 第一种情况没有给出正确的结果,而第二种情况工作正常。 结果可以在随附的示例数据中看到。 我很难理解这里的差异。
对我来说,似乎每一行 - 在第一种情况下,如果条件为真,则给出输出。 结果到此结束。
而在第二种情况下,它将顺序运行所有 3 个 if 语句,而不管前一个 if 语句的结果如何,并且输出将基于最后一个 true 条件。 我不确定我是否能够正确解释它。 再说一遍,我猜在第二种情况(多个 if 语句)中,前面的 If 语句有某种覆盖!

2. 上面的公式中用到了一个条件——“ Row() == Col Max(Row()) & :StartEnd == "Start" " 是如何实现的? 它运作良好,意味着 - 写得很好。 但我无法想象变量/计数器“val”如何停止?
有什么帮助吗?
谢谢,
回复:希望根据其他列的某些模式生成两列亲爱的@jthi (贾莫)和亲爱的@tx尼尔森(吉姆),
我真的很感谢您的支持和善意。
我肯定会通过这两种方法中的任何一种以及这两种方法的某种组合找到一种工作方式。
再次非常感谢你们俩。
圣诞快乐和新年快乐。 玩得开心。
此致,
哈利
回复:希望根据其他列的某些模式生成两列我尝试了一下。 我尽量避免使用 Lag() 并将其替换为 Col 函数。 最难的公式似乎是必填栏 1如果不使用 Lag() ,我无法快速找出好的公式(很可能有一个使用 Col Cumulative Sum 的解决方案)。 一种想法是用“正在进行”或类似的内容填充开始和结束之间的位置,然后您可能可以更轻松地使用“Col Cumulative Sum”,但随后最困难的公式很可能会移至开始和结束。
查看更多... 如果您有时间,我建议测试解决此问题的两种方法,一种@tx尼尔森提供了对 Lag 和比较的更多使用,以及我对 Col 公式的使用。 两者肯定都有各自的用例,从长远来看,理解它们将有助于您在 JMP 中编写公式/计算。 在某些情况下,当您了解如何将两者结合起来时,您可以仅使用公式来解决相当困难的任务。
此外,在逻辑工作后,我很可能会从数据表中删除公式(或将 Formula() 替换为 << Set Each value in script),因为如果数据表中的顺序发生更改,这很可能会中断。
回复:希望根据其他列的某些模式生成两列谢谢@tx尼尔森,
我取得了一些进展 - 并正确识别了每组的起点和终点。 我使用了一个非常简单的逻辑,你可以在公式栏中看到。
但现在我正在努力在每对“开始”和“结束”点之间放置数字。 我在将计数器停止在“结束”时遇到问题。 我的问题可能有同样的复杂性,但至少现在我在起点和终点上清除了标记/标签。
有什么帮助吗?
谢谢。

谢谢。
回复:希望根据其他列的某些模式生成两列问题似乎在于应用于 JSL 变量“other”的逻辑。我今天没有时间处理这个问题,但明天下午,我应该可以做一些调查。
回复:希望根据其他列的某些模式生成两列嗨吉姆,
对困惑感到抱歉。
你原来的公式(我相信,我没有搞砸)适用于大多数情况,但也捕获了一些错误点,并且错过了一些完整的数据集。 在附加的数据子集中(仅适用于一个“ID”和一个“子集”值),有一列基于您的公式,其中几乎没有错误点。
行:647-649 错误条目(红色)
行:868-937 未捕获(红色)
行:1307-1311 错误条目(红色)
当我对 :Occurrence 设置条件时,这个问题就得到了解决。
现在我正在寻找——
1. 出现的最后一个主传感器 = n(假设 n = 2),将其标记为“开始”
2. Occurrence = n+1 (= 3) 中的第一个主传感器,如果 n = 3 没有主传感器,则应停止/标记 Occurrence = n+2 == 4 中的值。 将其标记为“结束”
3. 最后在新列中填写“开始”和“结束”之间的数字。
另一种思考方式(可能是)——
如果我们可以将任何单个出现的 n (n = 2) 第一个主传感器标记为 END,将最后一个主传感器标记为 Start,然后在新列中填充 Start 和 End 之间的值。
我希望这会有所帮助并使事情变得清晰。
谢谢,
我想这可以,如果我能找到一个
回复:希望根据其他列的某些模式生成两列我很困惑。从我所看到的来看,我编写的脚本似乎可以工作,只是在数据表中的第 44 行之后,您更改了规则,并且现在希望 End 位于 Primary 的下一个值之前的行。你想要哪个?

回复:希望根据其他列的某些模式生成两列你好@tx尼尔森, 感谢您的答复。
我无法获得正确的(更新的要求)起点。 在数据表(“更新的样本数据”)和图像中,我手动输入了更正的数据列。
公式。 我曾经得到“Required Column 1 Old”和“Required Column 2 Old”是这样的(就像你给我的那样,我在上面添加了出现条件)-
RCValue = "";
:Required Column 1[Row()] = .;
If( :Occurrence != Lag( Occurrence, -1 ),
other = "Yes"
);
If( Row() == 1 | :ID != Lag( :ID ) | :"Sub-set"n != Lag( :"Sub-set"n ),
counter = 0;
withinStart = "No";
other = "Yes";
);
If(
:Sensor == "Primary" & :Occurrence == Lag( :Occurrence, -1 ) & Dif( :Occurrence ) == 0 &
withinStart == "Yes",
RCValue = "End";
withinStart = "No";
other = "No";,
:Occurrence != Lag( Occurrence, -1 ) & Lag( :Sensor, -1 ) != "Primary" & withinStart == "No"
& other == "Yes" & Row() != N Rows( Current Data Table() ),
withinStart = "Yes";
counter = counter + 1;
RCValue = "Start";
);
If( withinStart == "Yes" | RCValue == "End",
:Required Column 1[Row()] = counter
);
RCValue;

非常感谢。
回复:希望根据其他列的某些模式生成两列您已修改了我之前提供的代码,以获取您在最近的回复中提供的结果。 请提供您用于获取示例数据表中显示的结果的 JSL。
回复:希望根据其他列的某些模式生成两列你好@tx尼尔森和所有,
我能够根据我的要求完美地修改您的代码。 但在第二阶段故障排除时,我需要这样的东西——
标记:传感器=“主要”(第一个)围绕:发生的连续变化。在给定的屏幕截图中 -
所需值介于两者之间---最后的“小学”在出现次数 = 2和第一个“小学”在出现次数 = 3 [发生的连续变化]
找到第一个 Primary 并不难,不知道如何找到最后一个 Primary ? 考虑以某种方式反转(降序)Occurrence = 2 的子集数据,找到该值,然后将其恢复回来。 无法输入公式!! 还有其他方法可以做到这一点吗?
有什么帮助吗?
谢谢。

回复:希望根据其他列的某些模式生成两列你好@tx尼尔森,
它几乎在很少有错误条目的情况下工作。 我相信我们必须在 :Occurrence 列上添加额外的条件。 也就是说 :Occurrence 必须更改为设置 :Required Column 2 == "Start" (并且可能是选项 - 当 :Required Column 2 == "End" 时应该相同)。
类似于 - Dif(:Occurrence) !=0 then only :Required Column 2 == "Start"
对于我的示例数据(95 行)来说,您的公式很好,但我的实际数据超过 300k 行,它给出了许多错误条目,如下所示 - (我认为一旦添加对 :Occurrence 的附加要求,就应该没问题。 )这只是错误条目的一张截图。

希望!!我可以修改公式/代码,并可以添加 :Occurrence 的要求。在你的公式之上。
再次感谢您的支持。
回复:希望根据其他列的某些模式生成两列以下是您参考必填列 2 的列的公式。当您研究代码时,您会发现它所做的只是应用您声明的逻辑规则,在确定开始值和结束值时需要检查这些逻辑规则。它还包含“必需列 1”列的值设置。要运行此公式,只需创建“必需列 1”和“必需列 2”。将“必需列 2”设置为字符列。然后打开所需列 2 的公式并将以下公式复制到该列中。

RCValue = "";
:Required Column 1[Row()] = .;
If( :Sensor != "Primary",
other = "Yes"
);
If( Row() == 1 | :ID != Lag( :ID ) | :"Sub-set"n != Lag( :"Sub-set"n ),
counter = 0;
withinStart = "No";
other = "Yes";
);
If(
:Sensor == "Primary" & withinStart == "Yes",
RCValue = "End";
withinStart = "No";
other = "No";,
:Sensor == "Primary" & Lag( :Sensor, -1 ) != "Primary" & withinStart == "No" & other == "Yes" & Row() !=
N Rows( Current Data Table() ),
withinStart = "Yes";
counter = counter + 1;
RCValue = "Start";
);
If( withinStart == "Yes" | RCValue == "End",
:Required Column 1[Row()] = counter
);
RCValue;