完全に新しいデータ テーブルを作成するのではなく、新しいデータでデータ テーブルを更新したいという JMP ユーザーの声をよく耳にします。 これにはさまざまな理由が考えられます。データのクリーニングや再コーディングを既に行っている、作業内容と以前の分析をデータ テーブルに保存しておきたい、単に新しいデータを既存のデータ テーブルに追加する必要があるなどです。
のパート1この 2 回の連載では、最初のシナリオ、つまりスプレッドシート内の垂直構造化データについて説明しました。 これはそれほど複雑ではありません。新しいデータをインポートして元のデータに連結します (既にインポートされた行を考慮してください)。
今日は、もう少し複雑な 2 つ目のシナリオについてお話したいと思います。 ラボなどからの顧客のデータを見ると、このケースがよく見られます。 水平構造化データ テーブル:

つまり、最初の行/最初の列はパラメーター名で、次の列はデータです。 2 行目はユニット、3 行目はバッチ番号です。 次に空の行があり、その後、別のパラメーターに対して同じことが繰り返されます。 これはスプレッドシートで読むのは簡単ですが、最終的に分析するのは簡単ではありません。 この種のデータをよく目にしますが、水平構造を回避しようとするよりも、垂直方向にデータを入力するように人々を訓練する方がはるかに良いでしょう.
このような表を JMP にインポートして更新するにはどうすればよいでしょうか。 そのデータの何がそんなに難しいのですか?
課題を理解する必要があります。
- まず、データは行に配置されますが、さらに難しいのは、同様の情報を示す行が複数あることです。 パラメータ (P1、P2、P3)、単位、および各パラメータで繰り返される同じバッチ番号
- 次に、何が何に属しているかを簡単に解釈できるように、データを分割するための空の行があります。
データ分析の場合、この種の構造はマシンが好むものではありません。どのデータがどこにあるかを具体的に伝え、適切な分析を行う必要があります。 新しいデータが右側に追加された場合は、分析のデータ範囲を適切に調整する必要があります。
これらの課題のため、目的の場所に到達する前にデータを処理する必要があります。
更新したいテンプレートテーブルの作成を始めましょう
1. スプレッドシートから現在のデータにそのままアクセスします。

2. これは実際には必要なテーブルではないため、名前を「help」に変更し、データの転置の準備として空の行を削除する必要があります。コーディングでは、次のようになります。
dt_h1 << Set Name( name_worksheet || "help" );
// Remove rows with only missing values (break lines between measurements)
n = Loc( Column( 1 ) << Get Values, "" );
dt_h1 << Select Rows( n );
dt_h1 << Delete Rows;
- 注:非常に便利なLOCコマンドを使用して、削除する空の行を見つけました
3. 最初の列には、最終データに含めたい実際の列名があります。 後で使用するために保存します。 次に、テーブルを転置し、最終的なテーブル名を提供します (ワークシートとして - スプレッドシートで対応するワークシートを自動的に見つけるためにテーブル名を参照します)。
// Get names used for column names after transposing the data table
NewNames = dt_h1:Column 1 << Get Values;
// Transpose Column
dt_final = Data Table( name_worksheet || "help" ) << Transpose(
columns( 1 :: N Cols( dt_h1 ) ),
Label column name( "ColName" ),
Output Table( name_worksheet )
);

4. ここで、データ テーブルにいくつかの変更を加える必要があります。
- 最初の列を削除します
- 最初の行を削除します
- 列名を変更する
- 最後に、正しいデータとモデリング タイプを設定し (最初の行はすべて文字に設定されているため)、ファイルを保存します。
- この例では、スプレッドシートに列を追加せずに更新スクリプトをテストできるように、最後の 2 行も削除します。
- 注: システムのローカリゼーション設定と Office 言語に基づいて、データとモデリング タイプを変更する前に、JMP または小数点/カンマを最初に (たとえば、recode で) 設定する必要がある場合があります。
最終的なテーブルは次のようになります。

それでは、更新スクリプトを処理しましょう
必要なことのほとんどはすでに完了しており、スクリプトに自動的に保存されています。
- インポート元スクリプト
- 転置ソース スクリプト
- 上記の操作の一部とスクリプトの例
このテンプレート テーブルにスクリプトとして配置する最終的な更新スクリプトを見てみましょう。
1.現在のデータテーブルの名前でワークシートをインポートします
// Read in Sheet2 of the Excel workbook
excelFile = "TransposedExcelWorksheet.xlsx";
// Get the name of the data table and number of existing rows
cdt = Current Data Table();
cdtName = cdt << get name();
n_Rows = N Rows();
// Import the data invisible
dt_h1 = Open(
excelFile,
Worksheets( cdtName ),
Use for all sheets( 1 ),
Concatenate Worksheets( 0 ),
Create Concatenation Column( 0 ),
Worksheet Settings(
1,
Has Column Headers( 0 ),
Number of Rows in Headers( 1 ),
Headers Start on Row( 1 ),
Data Starts on Row( 1 ),
Data Starts on Column( 1 ),
Data Ends on Row( 0 ),
Data Ends on Column( 0 ),
Replicated Spanned Rows( 1 ),
Replicated Spanned Headers( 0 ),
Suppress Hidden Rows( 1 ),
Suppress Hidden Columns( 1 ),
Suppress Empty Columns( 1 ),
Treat as Hierarchy( 0 ),
Multiple Series Stack( 0 ),
Import Cell Colors( 0 ),
Limit Column Detect( 0 ),
Column Separator String( "-" )
),Invisible
);
2. 上記のようにテンプレート テーブルを変更し、データ テーブルを転置してクリーンアップします。
dt_h1 << Set Name( cdtName || "help" );
// Remove rows with only missing values (break lines between measurements)
n = Loc( Column( 1 ) << Get Values, "" );
dt_h1 << Select Rows( n );
dt_h1 << Delete Rows;
// Get names used for column names after transposing the data table
NewNames = dt_h1:Column 1 << Get Values;
// Transpose Column
dt_final = Data Table( cdtName || "help" ) << Transpose(
columns( 1 :: N Cols( dt_h1 ) ),
Label column name( "ColName" ),
Output Table( cdtName )
);
// Clean up data table - delete first row of column names and first column (labels)
dt_final << Select Rows( 1 );
dt_final << Delete Rows();
Column( dt_final, "ColName" ) << Set Selected;
dt_final << Delete Columns();
// Set the Column Names appropriately based on deleted first row in this table
For( i = 1, i <= N Cols( dt_final ), i++,
col = Column( i );
col << Set Name( NewNames[i] );
);
3. 既にインポートされた行を削除し、連結を使用して残りを元のデータ テーブルに追加します。
// remove rows already imported
dt_final << Select Rows( 1 :: n_Rows );
dt_final << Delete Rows();
// Append new data to original data table
cdt << Concatenate( dt_final, Append to first table );
// Close help data table
Close( dt_final );
Close( dt_h1 );<BR />
// this last bracket is to close the whole script!
);
- 注: JMP は、既存の列プロパティによってデータの処理方法を既に認識しているため、データとモデリング タイプに注意する必要はありません。
このスクリプトをテンプレート データ テーブルに追加すると、ボタンを 1 つ押すだけで、スプレッドシートの横方向の構造化データから新しいデータを取得できます。
結論
これには非常に多くの手順が含まれており、簡単に実行できるものもあれば、より高度なものもあります。 良い点は、JMP で実行できることです。 ただし、次のことを常に覚えておいてください。
データからインサイトを抽出する際に最も時間がかかるのは、データの準備です。
データを操作する場合は、データ分析用に調整された構造を使用してください。
これはほとんどの場合、各列が 1 つのパラメーターを表す垂直アプローチです。 ただし、行ベースのアプローチも実行できますが、正しいアプローチでお願いします。
分析を容易にする 2 つの例を提供するには、次のようにします。


- 注: パラメータ名の新しい列を追加すると、インポートされたデータを再配置する負担がなくなります。 また、分析プラットフォームでオーバーレイとして、またはグループごとに使用できるグループ化変数があります。 これにより、列ごとに同じ分析を実行する必要がなくなりますが、一度に実行されます。
もちろん、これを使用して、管理図やその他のトレンド分析を更新するなど、データに分析を追加することで拡張できます。 Windows スケジューラを使用して、レポートを更新し、新しい製品に送信することができます。 JMPライブであるため、他のユーザー (必ずしも JMP のライセンスを取得している必要はありません) は、データ フィルターや列スイッチャーなどの JMP の対話機能を使用して、Web ブラウザーでレポートにアクセスできます。
同様のことを行うためのユースケースやアプローチを自由に追加してください。 ご覧いただければ幸いです。
ではごきげんよう、
マーティン
PS: ファイルへの 3 つのコメント:
- Sheet2.jmp には、添付された Excel ファイルでデータ テーブルを更新するためのスクリプトがあります。 両方のファイルを同じフォルダーに保存する必要があります (これは簡単にするためです。Pick File() などを使用してハードコードされたファイル名を簡単に変更し、名前を抽出することもできます。
- 2 番目のスクリプトは「最後の 2 行を削除する」で、行を手動で削除することなく、データ テーブルの行を削除して Excel シートから再度更新できます。 だからすべてあなたの便宜のために
- ScriptUpdateHorizontal.jsl は、更新スクリプトを使用して最初のソース テーブルを作成し、データ テーブルに追加された最後の 2 行のスクリプトを削除します。 このスクリプトは、ブログの最初の部分も参照しているため、従うことができます。