希望根据其他列的某种模式生成两列大家好,
我希望根据其他两列(“Required column1”和“Required Column2”)中的模式生成两个新列。 请看附图——

任何帮助/建议?
谢谢。
脚本编写回复:希望根据其他列的某种模式生成两列这是您参考必需列 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;
回复:希望根据其他列的某种模式生成两列你好@txnelson ,
它几乎没有错误输入。 我相信我们必须在 :Occurrence 列上添加额外的条件。 也就是说 :Occurrence 必须更改为设置 :Required Column 2 == "Start"(并且可能是选项 - 当 :Required Column 2 == "End" 时它应该相同)。
类似 - Dif(:Occurrence) !=0 那么只有 :Required Column 2 == "Start"
对于我的示例数据(95 行),你的公式很好,但我的实际数据有超过 300k 行,它提供了许多错误的条目,如下所示 - (我认为一旦添加了对 :Occurrence 的额外要求,它应该没问题。 ) 这只是错误条目的截图之一。

希望!!我可以修改公式/代码并可以添加:发生的要求。在你的公式之上。
再次感谢您的支持。
回复:希望根据其他列的某种模式生成两列你好@txnelson和所有,
我能够完全根据我的要求修改您的代码。 但是在第二阶段的故障排除中,我需要这样的东西——
在 :Occurrence 的连续变化周围标记 :Sensor = "Primary" (1st)。在给定的屏幕截图中 -
之间的必需值---最后一个“初级”在出现次数 = 2和第一个“初级”在出现次数 = 3 [发生的连续变化]
找到第一个 Primary 并不难,不知道如何找到最后一个 Primary? 考虑以某种方式反转(降序)Occurrence = 2 的子集数据,找到该值然后将其还原。 无法输入公式!! 任何其他方式来做到这一点?
有什么帮助吗?
谢谢。

回复:希望根据其他列的某种模式生成两列您已经修改了我之前提供的代码,以获得您在最近回复中提供的结果。 请提供您使用的 JSL,以获得您在示例数据表中显示的结果。
回复:希望根据其他列的某种模式生成两列你好@txnelson , 感谢您的答复。
我无法获得正确的(更新的要求)起点。 在数据表(“更新的示例数据”)和图像中,我手动输入了更正的数据列。
公式。 我曾经得到“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;

非常感谢。
回复:希望根据其他列的某种模式生成两列我很迷惑。从我所见,我写的脚本似乎可以工作,只是在数据表中的第 44 行之后,您更改了规则,现在希望 End 位于 Primary 的下一个值之前的行上。哪个是你想要的?

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