计算滞后变化的其他列级别的列差我有一列 :EVENT(字符名义),其中包含各种值。还有另一列 :datetime(数字连续)。我有按升序排序的 :datetime 列。我希望有另一列计算每当发生“CONNECT”事件时,它与上一次“DISCONNECT”事件之间的时间差是多少。问题是 CONNECT 和上一次 DISCONNECT 之间的滞后可能会有所不同(见下图),我也希望保留这种高表格格式。希望有一个按升序排序的日期时间解决方案,但不排序也会有益。

基础数据分析与建模数据探索与可视化回复:计算滞后变化的其他列级别的列差例如,您可以在公式中使用变量来存储上次断开连接的值
Names Default To Here(1);
dt = New Table("Untitled",
Add Rows(12),
Compress File When Saved(1),
New Column("E", Character, "Nominal", Set Values({"A", "B", "Disc", "Con", "A", "B", "C", "B", "Disc", "A", "B", "Con"})),
New Column("T", Numeric, "Continuous", Format("Best", 12), Set Values([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]))
);
dt << New Column("Dif", Numeric, Continuous, Formula(
If(Row() == 1,
last_disc = .;
retval = .;
);
If(:E == "Disc",
last_disc = :T;
retval = .;
, :E == "Con",
retval = :T - last_disc
,
retval = .;
);
retval;
));

回复:计算滞后变化的其他列级别的列差这个方法很有效,谢谢!
回复:计算滞后变化的其他列级别的列差您还可以使用矩阵
Names Default To Here(1);
dt = New Table("Untitled",
Add Rows(12),
Compress File When Saved(1),
New Column("E", Character, "Nominal", Set Values({"A", "B", "Disc", "Con", "A", "B", "C", "B", "Disc", "A", "B", "Con"})),
New Column("T", Numeric, "Continuous", Format("Best", 12), Set Values([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]))
);
events = :E << get values;
times = :T << get values;
discs = Loc(events, "Disc");
cons = Loc(events, "Con");
difs = J(1, N Rows(dt), .);
difs[cons] = times[cons] - times[discs];
dt << new column("difs", numeric, continuous, values(difs));
这确实有相当多的假设,但可以对各种边缘情况变得更加稳健(Loc Sorted 对于这种情况很有帮助,有时甚至 KDTable/VPTree 也是如此)。
回复:计算滞后变化的其他列级别的列差稍微有点问题,有时 CONNECT 事件可能会在 DISCONNECT 事件出现之前出现几次。在这种情况下,我希望仅在 DISCONNECT 事件之后出现的第一个CONNECT 事件上计算差值。脚本是否有小幅修改可以适应这种情况?再次感谢您的帮助。
回复:计算滞后变化的其他列级别的列差这是对@jthi代码的修改,可以处理这个问题。
Names Default To Here(1);
dt = New Table("Untitled",
Add Rows(12),
Compress File When Saved(1),
New Column("E", Character, "Nominal", Set Values({"A", "B", "Disc", "Con", "A", "B", "C", "B", "Disc", "A", "B", "Con"})),
New Column("T", Numeric, "Continuous", Format("Best", 12), Set Values([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]))
);
dt << New Column("Dif", Numeric, Continuous, Formula(
If(Row() == 1,
last_disc = .;
retval = .;
);
If(:E == "Disc",
last_disc = :T;
retval = .;
firstCon = .;
, :E == "Con",
If(ismissing(firstcon), firstcon=:t);
retval = firstcon - last_disc
,
retval = .;
);
retval;
));
我建议您花时间阅读 JMP 帮助下的脚本指南。此外,请花时间研究回复的讨论论坛成员提供的代码。对 Jarmo 脚本的修改不需要任何新的脚本知识。它只需要在脚本流程中添加一些额外的逻辑。用户的目标应该是能够自己对脚本进行增强