JSL 変数による列内の経過時間を計算するこんにちは、
同じ DATE 列内の ID の観察間の日数を計算する JSL 列式を作成できるかどうか疑問に思っています (たとえば、「ID 別、日付別の経過日数を計算」)。出力では、同じ ID の出現を評価し、同じ ID の各出現間の経過時間を計算します。これは列 A と列 B の比較ではなく、列 A 内 (同じ列内) の評価です。
比較がないため (最初の観測)、ID の最初の観測は空白になることに注意してください。最初の観察の後、計算は 1 番目と 2 番目...2 番目と 3 番目...というように機能します。
以下はコンセプト案です。助けていただきありがとうございます。
| ID | 日にち | ELAPSED_DAYS |
| ABC123 | 2021 年 1 月 1 日 | |
| ABC123 | 2021年10月31日 | 303 |
| ABC123 | 2023 年 6 月 30 日 | 607 |
| EFG567 | 2021年6月30日 | |
| EFG567 | 2021年10月31日 | 123 |
| XYZ901 | 2021年5月31日 | |
自動化とスクリプト作成スクリプト作成Re: JSL 変数による列内の経過時間を計算するCol Min() と Date Difference を使用します。 最初の観測値が欠損値であることが本当に必要な場合は、if ステートメントを追加してそれを確認できます。
Names Default To Here(1);
dt = New Table("Untitled",
Add Rows(6),
Compress File When Saved(1),
New Column("ID",
Character,
"Nominal",
Set Values({"ABC123", "ABC123", "ABC123", "EFG567", "EFG567", "XYZ901"})
),
New Column("DATE",
Numeric,
"Continuous",
Format("m/d/y", 12),
Input Format("m/d/y"),
Set Values([3692304000, 3718483200, 3770928000, 3707856000, 3718483200, 3705264000])
),
New Column("ELAPSED_DAYS",
Numeric,
"Continuous",
Format("Best", 12),
Set Values([., 303, 607, ., 123, .])
)
);
dt << New Column("elapseddays", continuous, numeric, Formula(
Date Difference(Col Min(:Date, :ID), :Date, "day"))
);

Re: JSL 変数による列内の経過時間を計算するジャーモ
ありがとう、私が正しく解釈した場合、数式内の Col Min 関数は ID の最初の観測値 (最も古い日付) を確立します。
これは、最初の観測から「n 回目」の観測までの合計時間を知るのに役立ちます。
ただし、最新の観測値と以前の観測値 (各観測間の経過時間) も計算したいと考えています。 「n 番目」の観測値と「n 番目 - 1」番目の観測値など。以下の例では、「行 2 対 行 3」は 607 日の経過時間です (ID の 2 回目の観察と ID の 3 回目の観察)。
何かご意見は?フィードバックをお待ちしております。ありがとう。

Re: JSL 変数による列内の経過時間を計算するこの式は少し複雑に見えるかもしれませんが、列移動平均を使用して ID の以前の値を取得しています。
dt << New Column("elapseddays_new", continuous, numeric, Formula(
Date Difference(Col Moving Average(:Date, 1, 1, 0, :ID) * 2 - :Date, :Date, "day"))
);

他の良いオプションは、Lag() と if ステートメントを使用して ID が変更されたかどうかを確認することです。
Re: JSL 変数による列内の経過時間を計算する列数式で実行する必要がある場合は、ローカル変数が必要です。この列 jsl を使用します。
New Column( "Elapsed_days",
Numeric,
"Nominal",
Format( "Best", 9 ),
Formula(
Local( {ResetRow = 1},
If(
Row() == 1, .,
:ID != Lag( :ID ), ResetRow == Row(),
(:Date - Lag( :Date )) / In Days( 1 )
)
)
)
)Re: JSL 変数を使用して列内の経過時間を計算するおそらく最も簡単な方法は、日付列を ID で分割し、新しい列ごとに日付の計算をすべて実行してから、すべてを再度積み重ねることです。