JSL - 欠損データの % を検索します3つの列を持つデータテーブルがあります

ID と SUB_ID でグループ化された HEIGHT 列の欠落データの割合を示すテーブルを作成する必要があります。 上記の場合、結果は次のようになります。

ただし、場合によっては、データが欠落している行がない可能性があります。 その場合、欠落パーセントは 0 になるはずです。

このための JSL スクリプトを書くのに助けが必要です。 ご指導よろしくお願いいたします。 以下のスクリプトには 3 つの問題があります。
1. データテーブルへのハンドル/参照を追跡して、いつでも呼び出せるようにするにはどうすればよいですか。 私はスクリプトの先頭で常に「dt = CurrentDataTable」を使用してきました。 しかし、いくつかのサマリー テーブル/サブセット テーブルを作成した後、元のテーブルへの参照が失われ、それを最新のテーブルにする方法がわかりません。
2. 欠落行がない場合でもこれを機能させる必要があります。 現時点ではスクリプトが途中で停止しています。
3. 欠落率のある最後のテーブルを除くすべてのテーブルを閉じる必要があります。
// Read the original table
dt = CurrentDataTable();
main_table = Data Table( dt ) << get name; // get the table name
// Create a summary table with no of rows grouped by ID and SUB_ID
dt_summary = dt<< Summary(Group(:ID, :SUB_ID), Freq("None"), Weight("None"), output table name( "Main Table Summary"));
:N Rows << Set Name( "Total No of Rows" );
// Create a subset of the original table with only the missing rows
Current Data Table(Data Table(main_table));
dt = CurrentDataTable();
dt_missing = dt << select where( Is Missing( :HEIGHT ) == 1 ) << Subset(Output Table Name("Missing Rows"));
If( !Is Empty( dt_missing ),
dt_missing_summary = Data Table( dt_missing ) << Summary(
Group( :ID, :SUB_ID ),Freq("None"), Weight("None"), output table name( "Missing Rows Table Summary"));
:N Rows << Set Name( "No of Rows with Missing Data" );
dt_missing_summary << Update(
With( Data Table( dt_summary ) ),
Match Columns( :ID = ID, :SUB_ID = :SUB_ID ),
Add Columns from Update table( :Total No of Rows )
);
New Column( "PercentMissing",
Numeric,
"Continuous",
Format( "Percent", 12, 2 ),
Formula( :No of Rows with Missing Data / :Total No of Rows )
);
);
//Close( dt_missing, nosave );
//Close( dt_summary, nosave );ありがとう
データのブレンディングとクリーンアップRe: JSL - 欠損データの % を見つけるご返信ありがとうございます。 N Missing を使用して欠落したデータ行を検索できることを今まで知りませんでした。 これにより作業がはるかに簡単になり、スクリプトのステップがいくつか減りました。Re: JSL - 欠損データの % を見つける段階的な説明ありがとうございます。 ステップ 1、2、4 は私が新しく学んだテクニックで、とても役に立ちます。 データが欠落していないのに、なぜスクリプトが失敗するのか不思議ではありません。 複数の条件を適用する場合は、必ずステートメントを分割するようにします。Re: JSL - 欠損データの % を見つけるシンプルでコンパクトな解決策をありがとうございます。 元のテーブルに余分な列が追加されますが、それは私にとって問題ではありません。Re: JSL - 欠損データの % を見つける以前にこれを見た場合は、もう一度読んでください。 間違いがありました。
JMP の組み込み関数 Col N Missing ( ) を使用すると、このタスクが簡素化されます。 2つのアプローチを紹介します。
解決策 #1:
- 最初のテーブルにグループごとに欠損値をカウントする列を作成します。
- 最初の表を要約します。
- (必要に応じて) N 行列の名前を変更し、比率の数式列を作成します。
Names Default To Here( 1 );
//these 2 lines just create a table with overall missing rate of 35% for the weight varable.
dt = Open( "$Sample_Data\Car Physical Data.jmp" );
dt:weight[Loc( J( 116, 1, Random Binomial( 1, .35 ) ) == 0 )] = .;
//add a formula column to compute n missing rows.
dt << New Column( "Missing Rows", formula( Col N Missing( :weight, :country, :type ) ) );
//create summary table, rename N Rows column, and add a % missing formula column.
dtSum = dt << Summary( Group( :Country, :Type, :missing rows));
dtSum:N Rows << set name("Total Rows");
dtSum << new column ("Pct Missing", formula(:missing rows / :total rows));
解決策 #2:
- 最初のテーブルにすべての数式列を作成し、そのまま要約を取得します。
- 必要に応じて、概要テーブルから N Rows 列を削除します。
** このメソッドの「落とし穴」は Total Rows ( ) 関数にあります。 最初の引数はグループ化列として使用できないため、最初の引数をダミー列として機能させるために「1」で始める必要があります。 1 を省略すると、カウントには国とタイプの組み合わせではなく、「タイプ」グループ内の行数のみが反映されることがわかります。
乾杯、そして最初のエラーについてお詫び申し上げます。
Names Default To Here( 1 );
//don't worry about these; these are just to get a table present with some missing values @ an
//overall missing rate of 35%
dt = Open( "$Sample_Data\Car Physical Data.jmp" );
dt:weight[Loc( J( 116, 1, Random Binomial( 1, .35 ) ) == 0 )] = .;
//create formula columns using built-in functions to get what you're after.
dt << New Column( "Missing Rows", formula( Col N Missing( :weight, :country, :type ) ) );
dt << New Column( "Total Rows", formula( Col Number( 1, :country, :type ) ) );
dt << New Column( "Group Pct Missing", formula( :missing rows / :total rows ) );
//view summary table.
dtSum = dt << Summary( Group( :Country, :Type, :missing rows, :total rows, :group pct missing));
Re: JSL - 欠損データの % を見つける- 追加する必要があります
Names Default To Here( 1 );
スクリプトで指定された変数が、同じ名前の他のスクリプトの変数によって変更されないように制限するには、現在のスクリプトの値を変更します。
- Current Data Table() 関数について誤解があるようです。これは 2 つの異なる方法で使用でき、元のデータ テーブルへの参照を失わないようにするのに役立ちます。仕様
dt = Current Data Table();
あなたは適切に使用しています。スクリプトの後半で、元のデータ テーブルを「現在のデータ テーブル」にしたい場合は、次の操作を行うだけです。current data table(dt);
これにより、JMP は現在のデータ テーブルとして「dt」を使用するように指示されます。避けなければならないのは、「=」の左側に「dt」を配置して再代入することです。
- 場合によっては、単一のステートメントにアクションを組み合わせることが適切ではないことがあります。あなたの
dt_missing = dt << select where( Is Missing( :HEIGHT ) == 1 ) << Subset(Output Table Name("Missing Rows"));行の選択とテーブルのサブセット化をすべて 1 つのステートメントで行うことを想定しています。問題は、:Height の値が欠落していない場合、必要なものを提供できないことです。あなたのスクリプトを再作成したところ(下記)、dtデータテーブルに行が選択されているかどうかがチェックされ、欠落している行が見つかったかどうかが確認され、見つかった場合のみ処理を続行します。dt << select where( Is Missing( :HEIGHT ) == 1 );
If( N Rows( dt << get selected rows ) > 0,
- Try() 関数は、失敗する可能性がある関数を実行する場合に非常に便利で、失敗した場合にスクリプトの実行を停止したくない場合があります。あなたが使用している Close() 関数と Try() 関数の使用に最適な関数
Try( Close( dt_missing, nosave ) );
Try( Close( dt_summary, nosave ) );
これがお役に立てば幸いです....さらに質問がある場合は、返信してください。
Names Default To Here( 1 );
// Read the original table
dt = Current Data Table();
//main_table = Data Table( dt ) << get name; // get the table name
// Create a summary table with no of rows grouped by ID and SUB_ID
dt_summary = dt << Summary(
Group( :ID, :SUB_ID ),
Freq( "None" ),
Weight( "None" ),
output table name( "Main Table Summary" )
);
:N Rows << Set Name( "Total No of Rows" );
// Create a subset of the original table with only the missing rows
//Current Data Table(Data Table(main_table));
//dt = CurrentDataTable();
dt << select where( Is Missing( :HEIGHT ) == 1 );
If( N Rows( dt << get selected rows ) > 0,
dt_missing = dt << Subset( Output Table Name( "Missing Rows" ), selected rows( 1 ) );
dt_missing_summary = Data Table( dt_missing ) <<
Summary(
Group( :ID, :SUB_ID ),
Freq( "None" ),
Weight( "None" ),
output table name( "Missing Rows Table Summary" )
);
:N Rows << Set Name( "No of Rows with Missing Data" );
dt_missing_summary << Update(
With( Data Table( dt_summary ) ),
Match Columns( :ID = ID, :SUB_ID = :SUB_ID ),
Add Columns from Update table( :Total No of Rows )
);
New Column( "PercentMissing",
Numeric,
"Continuous",
Format( "Percent", 12, 2 ),
Formula( :No of Rows with Missing Data / :Total No of Rows )
);
);
Try( Close( dt_missing, nosave ) );
Try( Close( dt_summary, nosave ) );
Re: JSL - 欠損データの % を見つける@jthi 、
私たちは同時に同じ方向に沿って考えていました。あなたの答えが私のものよりももう少し完全であることが気に入っており、項目 1 と 3 の提案に同意します。
Re: JSL - 欠損データの % を見つけるまず、JMP スクリプト ガイドを確認することを強くお勧めします。 JMP15 スクリプト ガイドおよびスクリプト インデックスは Jmp / ヘルプ / スクリプト インデックスから見つかります。 これらは、JSL スクリプトの非常に優れたソースです。
このタスクを実行するには、JSL は必要ありません。
1. 2 つの欠損値を提供したテーブルの例から始めましょう
2. N Missing、統計として高さ、グループとして SUB_ID と ID を使用してテーブルの概要を作成します。


3. N 行と N 個の Missing(HEIGHT) 列を選択して新しい式を作成します

4. 必要に応じて、列のプロパティから形式をパーセントに変更し、列の名前を変更します。
これらの手順に基づいて、JMP が提供する機能を非常に簡単に使用して、この手動プロセスを自動プロセスに変更する手順に必要なスクリプトを表示することもできます (より堅牢にするために小さな変更を行う必要があります)。
質問 1 と 3 については、次のとおりです。
1. データテーブルをどのように作成/オープン/取得するかによって大きく異なります。 常に同じ名前を持っている場合は、それを参照できますが、同じ名前を持つ複数のデータテーブルを作成するのは非常に簡単で、JMP は名前の後にインデックスを追加するため、長期的にはそれを信頼しません。 ただし、これらは Datatable(nameofdatatable) によって参照できます。
3. Get Data Table List()でデータテーブルのリストを取得できます。 データテーブルをループし、不要なデータテーブルを閉じます。 ただし、私の意見では、必要のないデータテーブルは、Close(reference to datatable, No save) を使用してできるだけ早く閉じる必要があります。
タスクを実行するスクリプトの例:
Names Default To Here(1);
//create example data and add reference to dt variable
dt = New Table("exampledata",
Add Rows(8),
Compress File When Saved(1),
New Column("ID",
Numeric,
"Nominal",
Format("Best", 12),
Set Values([1, 1, 1, 1, 2, 2, 2, 2])
),
New Column("SUB_ID",
Character,
"Nominal",
Set Values({"A", "A", "B", "B", "A", "A", "B", "B"})
),
New Column("HEIGHT",
Numeric,
"Continuous",
Format("Best", 12),
Set Values([10, 11, ., 9, ., 12, 8, 12])
)
);
//note Link to original data table(0)
//dt_summary is reference to the new Summary table
dt_summary = dt << Summary(
Group(:ID, :SUB_ID),
N Missing(:HEIGHT),
Freq("None"),
Weight("None"),
Link to original data table(0),
output table name("Main Table Summary")
);
//close unnecessary datatable
Close(dt, no save);
//add new column with formula
dt_summary << New Column("Percent Missing",
Numeric,
"Continuous",
Format("Percent", 12, 0),
Formula(:Name("N Missing(HEIGHT)") / :"N Rows"),
);
//rename columns
Column(dt_summary, "N Rows") << Set Name("Total No of Rows");
Column(dt_summary, "N Missing(HEIGHT)") << Set Name("No of Rows with Missing Data");
Re: JSL - 欠損データの % を見つけるこんにちは@rverma 、
テーブル内の概要を活用できることがわかりました。このセクションで行っていることのほとんどを作成し、比率 (%) を計算する数式を含む列を追加できます。
欠落データがない場合でも機能する次のようなスクリプトを作成できます (項目 2 に対応)。
sumdt = dt << Summary( Group( :ID, :SUB_ID ), N Missing( :HEIGHT ), Freq( "None" ), Weight( "None" ) );
sumdt << New Column( "Percent Missing",
Numeric,
Continuous,
Format( Percent ),
Formula( :"N Missing(HEIGHT)"n / :N Rows )
);
次に、これをサブセット化できます。 さらに他のウィンドウを閉じます。
それは始まりです