特定の日付範囲に関連する特定の値のみを選択するスクリプトを作成するこれに似たファイルを渡されました

開始日から終了日までの間に発生したすべてのコードを取得する数式を作成するように依頼されました。これを数式として設定する方法がわかりません。これは、開始日から終了日までの間に発生したすべてのコードを取得するスクリプトとして作成できるものなのでしょうか? これまでスクリプトを設定したことがないので、作成方法を教えていただけると幸いです。
ありがとう!
データの探索と視覚化Re: 特定の日付範囲に関連する特定の値のみを選択するスクリプトの作成コミュニティへようこそ。
指定された日付範囲内の行を選択し、選択された行だけを含む新しいデータ テーブルを作成する実際のステートメント。
// Select the row that have the date range desired
dt << select where( :Start Date >= informat("01/10/2025","m/d/y") &
:End Date <= informat("04/30/2025","m/d/y"));
// Create the new table
dtSubset = dt << subset( selected columns(0), selected rows(1), output table("theSubset"));
以下は、最初にサンプル データ テーブルを作成し、次に上記の行を実行してデータ テーブルを選択して作成する完全な例です。
(注: 以下の例は、元の投稿では何らかの理由で省略されていました。省略について教えてくれた@jthiに感謝します)
Names Default To Here( 1 );
// Create an Example data table
dt = New Table( "Example",
Add Rows( 20 ),
New Column( "Start Date",
Format( "m/d/Y" ),
set each value( Today() + In Days( Random Integer( 1, 100 ) ) )
),
New Column( "End Date",
Format( "m/d/Y" ),
set each value( :Start Date + In Days( Random Integer( 1, 50 ) ) )
)
);
// Select the row that have the date range desired
dt << select where(
:Start Date >= Informat( "01/10/2025", "m/d/y" ) & :End Date <=
Informat( "04/30/2025", "m/d/y" )
);
// Create the new table
dtSubset = dt << subset(
selected columns( 0 ),
selected rows( 1 ),
output table( "theSubset" )
);
新しいテーブルを作成するもう 1 つの興味深いインタラクティブな方法は、データ フィルターを使用することです。データ フィルターを使用すると、ユーザーはデータ テーブル内の行をインタラクティブに選択でき、目的の行を選択すると、それらの行から新しいテーブルを作成できます。
これを行うには:データテーブルが表示されたら

行のプルダウンメニューに移動し、「データフィルター」を選択します。

データフィルターウィンドウで、開始日と終了日を選択し、+記号をクリックします。

フィルターが表示されます。
[表示] および [含める] チェックボックスをクリックします。フィルターの設定で行が選択されたときに、データ テーブル内の行に対して実行するアクションを示します。

これで、フィルターを設定して選択を行うことができます。青い線を希望の開始日と終了日にドラッグするか、各フィルターの表示された日付領域に値を直接入力することができます。
フィルターが変更されると、データテーブル内の行が選択されることに注意してください。

目的の行を選択したら、データフィルターの赤い三角形のアクションリストからサブセットの表示を選択して、新しいデータテーブルを作成できます。データフィルターのタイトルの横にある赤い三角形をクリックし、オプションを選択します。


Re: 特定の日付範囲に関連する特定の値のみを選択するスクリプトの作成例の作成を少し簡単にするために、サンプル表を提供していただけますか?
おそらく、このために数式を作成するのではなく、スクリプトを作成します。各行で、date_x が開始日と終了日の間にあるすべての code_x 値を抽出したいとお考えですか? どこに記録すればよいですか? 重複データに対してはどのような処理をすればよいですか? データ形式は変更できますか (データを積み重ねることはできますか)?
@txnelson JMP コミュニティはあなたの完全な例を削除しましたか?
Re: 特定の日付範囲に関連する特定の値のみを選択するスクリプトの作成これは使用するサンプル テーブルです。おっしゃるとおり、各行を調べて、開始日と終了日の間の各日付のコードを取得する必要があります。重複があっても問題ありません。最終的には、すべてのコードが同じか、各時間枠に異なるコードがあるかを知る必要があります。各行について、開始日と終了日の間にあるコードがすべて「2」か、すべて「3」か、またはコードの組み合わせかを知る必要があります。
うまくいく式が思いつかないので、何らかのスクリプトが必要だと思います。スクリプトを作成した経験がないので、どんな助けでもいただければ幸いです。
Re: 特定の日付範囲に関連する特定の値のみを選択するスクリプトの作成これはおそらく、最終的なニーズを念頭に置いてはるかに簡単にすることができますが、正確な仕様/結果の列がないため、前進するのに役立つと思われるものを作成しました。
Names Default To Here(1);
dt = Open("$DOWNLOADS/example table.jmp");
Try(Column(dt, "Date 1") << Set Name("date_1"));
date_cols = Filter Each({colname}, dt << Get Column Names("String"),
Starts With(colname, "date_");
);
code_cols = Filter Each({colname}, dt << Get Column Names("String"),
Starts With(colname, "code ");
);
dt << New Column("Result", Character, Multiple Response);
For Each Row(dt,
dates = dt[Row(), date_cols];
between_bin = :"Start date"n <= dates <= :"Stop date"n;
between_idx = Loc(between_bin);
If(N Items(between_idx) > 0,
codes = dt[Row(), code_cols[between_idx]];
valid = Loc(codes);
If(N Items(valid) == 0,
codes = {};
,
codes = As List(codes[valid`]);
);
,
codes = {};
);
res = Transform Each({code}, codes,
Char(code);
);
:Result = Concat Items(res, ", ");
);

Re: 特定の日付範囲に関連する特定の値のみを選択するスクリプトの作成Jarmo のコードは素晴らしいです。彼がどのように問題に取り組み、解決するかを見るのは楽しいです。しかし、私は人生のほとんどにおいて、同僚、友人、配偶者、子供たちから、考え方が変わっていると見なされてきました。調子が良い日には、「オタク」と呼ばれます。
ですから、私の人生の立場を考えると、ほとんどの人は私と同じようには考えていないということが分かりました。
@PruningTheSparkは言う
「うまくいく数式が思いつかないので、これは何らかのスクリプトである必要があると思います。スクリプトを作成した経験がないので、どんな助けでもありがたいです!! 」。
JMP ユーザーの大半は PruningTheSpark の立場に近いと思います。PruningTheSpark は、この問題に対するスクリプト以外の解決策はないと考えているかもしれませんが、JMP のインタラクティブなデータ操作機能は非常に強力です。そこで、以下に PruningTheSparks の問題を解決するためのインタラクティブな手順をまとめました。
提供されたサンプル データ テーブルから始めて、少し変更しました。Jamo のスクリプトの結果を見ると、どの行にも有効なコードが 1 つ以上ないことがわかります。コードが複数ある可能性があるので、行 2 に複数のコードがあることを示すコードを行 2 に追加しました。

最初のタスクは、開始日と終了日の範囲内にあるすべてのコードを見つけることです。 6 つの異なるコード列があるため、これをすべて一度に実行する最も簡単な方法は、データを積み重ねることです。
テーブル=>スタック

これは、日付とコードの列を積み重ねた複数のシリーズスタックです。
これで、欠損値のあるコードはすべて結果に反映されないため、削除できます。そこで、すべてのコードを含むデータ2列で欠損値のあるセルを1つ選択し、右クリックして「結合セルの選択」を選択します。

これにより、列データ 2 に欠損値があるすべての行が選択されます。
RowState列を右クリックして、行の削除を選択します。

コードのある行だけが残ります

ここで、開始日と終了日の間にどのコードが該当するかを判断する必要があります。そのためには、新しい列を作成します。この列を「in between」と名付け、次の式を入力します。

列データ(元のテーブルの日付を含む)が範囲内の場合は 1、範囲外の場合は 0 である行には 1 が入ります。

欠損値のあるコードを削除するときと同じ手法を使用して、ゼロの行を選択して削除することができます。

テーブルをクリーンアップするには、不要になった列の一部を削除します。

ここでの課題は、コードを1行に戻すことです。これを行うには、単純な分割を行うことができます。
テーブル=>分割


コード列を1つの列に結合するには、「列の結合」という列ユーティリティを使用します。結合する列を選択して
列=>ユーティリティ=>列の結合

すると、新しい列の名前と、項目間に配置する区切り文字(この場合は「,」)を入力するための入力ボックスが表示されます。

これにより、テーブルに新しい列が追加されます

不要になった列を削除してテーブルを整理すると、

後は、結果を元のデータテーブルに戻すだけです。これを行うには、更新プラットフォームを使用します。元のテーブルをクリックして
テーブル=>更新

更新を取得するテーブルに入力し、元のテーブルのrecord_idを分割テーブルのrecord_idと一致させて[OK]をクリックすると、元のテーブルにソリューションが含まれます。

スクリプトは使用されず、2 つの単純な数式列のみが必要でした。
さて、これらの手順を実行すると、JMP は実行された対話型手順を作成するために必要な JSL をログに記録します。そのため、これらの JSL の一部をスクリプトにコピーするだけで、実行すると瞬く間にソリューションが完成するスクリプトを作成できます。
names default to here(1);
dt = data table( "Example Table" );
// Stack data table
// → Data Table( "Stacked" )
dtStacked = Data Table( "example table" ) << Stack(
columns(
:date_1, :code 1, :date_2, :code 2, :date_3, :code 3, :date_4, :code 4,
:date_5, :code 5, :date_6, :code 6
),
Number of Series( 2 ),
Output Table( "Stacked" )
);
wait(0);
// Delete selected rows
Data Table( "Stacked" ) << Select Where( Is Missing( :Data 2 ) ) << Delete Rows;
// Delete columns
Data Table( "Stacked" ) << Delete Columns( :Label, :Label 2 );
// New column: is between
Data Table( "Stacked" ) << New Column( "is between",
Numeric,
"Continuous",
Format( "Best", 12 )
);
// Change column formula: is between
Data Table( "Stacked" ):is between << Set Formula(
:Data >= :Start date & :Data <= :Stop date
);
// Delete selected rows
Data Table( "Stacked" ) << Select Where( :is between == 0 ) << delete rows;
// Delete column: is between
Data Table( "Stacked" ) << Delete Columns( :is between );
// Delete columns
Data Table( "Stacked" ) << Delete Columns( :Stop date, :Start date, :Data );
// Split data table
// → Data Table( "Split" )
Data Table( "Stacked" ) << Split(
Split By( :Data 2 ),
Split( :Data 2 ),
Group( :record_id ),
Output Table( "Split" ),
Sort by Column Property
);
// Combine columns
Data Table( "Split" ) << Combine Columns(
columns( :"1"n, :"2"n, :"3"n ),
Column Name( "Result" ),
Delimiter( "," )
);
// Delete columns
Data Table( "Split" ) << Delete Columns( :"1"n, :"2"n, :"3"n );
// Update data table
Data Table( "example table" ) << Update(
With( Data Table( "Split" ) ),
Match Columns( :record_id = :record_id )
);
また、新しいワークフローを開き、レコーダーをオンにして手順を実行すると、将来ソリューションを作成するために使用できるワークフローが作成されます。

Re: 特定の日付範囲に関連する特定の値のみを選択するスクリプトの作成ご協力ありがとうございました!
Re: 特定の日付範囲に関連する特定の値のみを選択するスクリプトの作成ご協力ありがとうございます。スクリーンショットは非常に役に立ちます。