遅延が変化する他の列レベルの列差を計算するさまざまな値を持つ列 :EVENT (文字名目) があります。また、別の列 :datetime (数値連続) もあります。昇順にソートされた :datetime 列があります。別の列で、"CONNECT" イベントがあるたびに、そのイベントと最後の "DISCONNECT" イベントの時間差を計算することに興味があります。問題は、CONNECT と前回の DISCONNECT の間で遅延が変化する可能性があることです (下の写真を参照)。また、この縦長のテーブル形式を維持したいと考えています。昇順にソートされた datetime のソリューションはありがたいですが、ソートされていないものも便利です。

基本的なデータ分析とモデリングデータの探索と視覚化Re: 遅延が変化する他の列レベルの列差を計算するたとえば、最後の切断の値を格納するために数式で変数を使用することができます。
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;
));

Re: 遅延が変化する他の列レベルの列差を計算するこのアプローチはうまくいきました。ありがとうございます!
Re: 遅延が変化する他の列レベルの列差を計算する行列を使うこともできます
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 も役立ちます)。
Re: 遅延が変化する他の列レベルの列差を計算するこれに少し工夫を加えると、DISCONNECT イベントが発生する前に CONNECT イベントが数回発生する場合があります。この場合、DISCONNECT イベントの後に表示される最初のCONNECT イベントでのみ差異を計算したいと考えています。これに対応できるようにスクリプトに少し変更を加えることはできますか? ご協力ありがとうございました。
Re: 遅延が変化する他の列レベルの列差を計算するこれを処理するための@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 のスクリプトの変更には、新しいスクリプトの知識は必要ありません。スクリプトのフローにロジックを追加するだけで済みます。スクリプトを独自に強化できるようにすることがユーザーの目標です。