Re: グループ (センサー データとアセット) ごとの JSL インデックス付き列でのスタック多分このようなもの:
Names Default To Here( 1 );
//dt=open("input_example.jmp");
//Stack data table
Data Table( "input_example.jmp" ) << Stack(
columns( Column Group( "A sensors" ), Column Group( "B sensors" ) ),
Source Label Column( "Label" ),
Stacked Data Column( "Data" ),
Output Table( "Stacked Data" )
);
//Text to columns
Data Table( "Stacked Data" ) << Text to Columns(
columns( :Label ),
Delimiters( " " )
);
//Delete column: Label 2
Data Table( "Stacked Data" ) << Delete Columns( :Label 2 );
//Change column name: Label 1 → Asset
Data Table( "Stacked Data" ):Label 1 << Set Name( "Asset" );
//Change column name: Label 3 → Sensor
Data Table( "Stacked Data" ):Label 3 << Set Name( "Sensor" );
//New column: Column 6
Data Table( "Stacked Data" ) << New Column( "Stddev of Sensor by Asset by Index",
Numeric,
"Continuous",
Format( "Best", 12 )
);
//Change column formula: Stddev of Sensor by Asset by Index
Data Table( "Stacked Data" ):Stddev of Sensor by Asset by Index <<
Set Formula( Col Std Dev( :Data, :Asset, :Index ) );
//Report snapshot: Stacked Data - Graph Builder
Data Table( "Stacked Data" ) << Graph Builder(
Size( 517, 450 ),
Show Control Panel( 0 ),
Variables(
X( :Index ),
Y( :Stddev of Sensor by Asset by Index ),
Overlay( :Asset )
),
Elements( Line( X, Y, Legend( 7 ) ), Points( X, Y, Legend( 8 ) ) )
);
このスクリプトを「作成」するために、JMP 17 の Worflow Builder を使用しました。
重要なのは、数式で「by」引数を使用することです。

これにより、データを完全に積み重ねて、データがすべて 1 つの列にある完全な階層を持つことができます。
次に、データ列全体の stddev をアセット別およびインデックス別に取得します。 これにより、次のグラフを作成できます。

Re: グループ (センサー データとアセット) ごとの JSL インデックス付き列でのスタックこれは良いアプローチです。 ただし、完全に積み上げられたテーブルには、「by」引数を持つ数式に限定されるという問題があります。
たとえば、(センサー 1 - センサー 2) / センサー 3 という数式を実行したい場合、積み上げテーブルが必要になります。
Re: グループ (センサー データとアセット) ごとの JSL インデックス付き列でのスタック将来の読者の混乱を避けるために、応答は削除されました
Re: グループ (センサー データとアセット) ごとの JSL インデックス付き列でのスタック1 つのオプションは、階層テーブルがある場合は、純粋な JSL ルートを使用することです。 コードはそれ自体を説明できるかもしれません:
Names Default To Here(1);
dt_hier = Open("$DOWNLOADS/hierarchy_example.jmp");
dt_input = Open("$DOWNLOADS/input_example.jmp");
// some assumptions:
// both parents will have same amount of columns
new_col = dt_hier << New Column("Data Cols", Character, Nominal, << Set Each Value(
Regex(:Child column, "sensor \d")
));
data_cols = Associative Array(new_col) << get keys;
dt_hier << Delete Column(new_col);
dt_collector = New Table("data",
New Column("Index", Numeric, Ordinal),
New Column("Group", Character, Nominal)
);
For Each({data_col}, data_cols,
dt_collector << New Column(data_col, Numeric, Continuous)
);
Summarize(dt_hier, parents = by(:Parent));
For Each({parent}, parents,
parent_rows = Loc(dt_hier[0, "Parent"], parent);
parent_cols = dt_hier[parent_rows, "Child column"];
parent_data = dt_input[0, parent_cols];
non_missing_idx = Loc(parent_data);
row_count = N Items(non_missing_idx) / n cols(parent_data);
parent_data_clean = Shape(parent_data[non_missing_idx], row_count);
first_row = N Rows(dt_collector) + 1;
last_row = first_row + row_count - 1;
dt_collector << Add Rows(row_count);
dt_collector[Index(first_row, last_row), "Index"] = Index(1, row_count)`;
dt_collector[Index(first_row, last_row), "Group"] = Repeat({parent}, row_count);
dt_collector[Index(first_row, last_row), data_cols] = parent_data_clean
);

ここで行われたかなりの数の仮定と、適切なエラー処理はありません
Re: グループ (センサー データとアセット) ごとの JSL インデックス付き列でのスタック階層は、メタデータ (列プロパティ) として既にテーブルに存在している場合があります。
親 (グループ)、親エイリアス、子、および子エイリアスがテーブルに埋め込まれているように、例を更新しました。
最も直感的なアプローチは、資産 (サブセット) ごとにテーブルを積み重ね、ラベルごとにデータを分割し、テーブルを連結することだと思います。
Re: グループ (センサー データとアセット) ごとの JSL インデックス付き列でのスタックまた、要件を簡素化し (空の値をなくす)、反復的に (アセットごとに) 実行する必要があるソリューション (スタック、分割、連結) を見つけました。 階層データがメイン テーブルに埋め込まれました (進行状況は input_example で確認できます)。
Re: グループ (センサー データとアセット) ごとの JSL インデックス付き列でのスタック私が見つけた最も簡単な操作は、これらのデータ ステップを自動化することでした。
1) スタック

2) スプリット

3) 連結する

JSL インデックス付き列のグループ別のスタッキング (センサー データとアセット)製造業では、センサー データを次の形式で抽出するのが一般的です。 A と B は同様のデバイス (として知られています) に対応します。資産)。
この形式では、ユーザーは親グループごとに結合された式を作成する必要があります。 例えば:
(入力: センサー データ テーブルには親グループごとに特定の列が必要です)

複数のアセットを扱う場合、これは面倒になるため、グループ アセットごとにデータをスタックすることをお勧めします。
これをプログラムで行うには、階層を含むコンテキスト データが必要です。 例えば:
(入力: アセット階層)

JSL では、センサー データと階層 (入力) からアセット テーブル (目的の出力) にどのように移動できるでしょうか?
(出力: 資産データテーブル)

すべてのテーブルとスクリプトが添付されています。 以下は入力テーブル スクリプトです (親子を含むメタデータが列プロパティとして追加されます)。
Names Default To Here( 1 );
// New data table
dt = New Table( "sensor table" );
n_rows = 10;
n_additional_rows = 0;
// New column: Index
dt << New Column( "Index", Numeric, "Continuous", Format( "Best", 12 ) ) <<
Begin Data Update << Add Rows( n_rows );
dt:Index << Set Formula( Row() );
dt << End Data Update;
// A sensor
dt << New Column( "A sensor 1",
Numeric,
"Continuous",
Format( "Best", 12 ),
Set Selected
) << New Column( "A sensor 2",
Numeric,
"Continuous",
Format( "Best", 12 ),
Set Selected
) << New Column( "A sensor 3",
Numeric,
"Continuous",
Format( "Best", 12 ),
Set Selected
) << Group Columns( "A sensors", {:A sensor 1, :A sensor 2, :A sensor 3} )
<< Begin Data Update;
For Each Row(
dt,
:A sensor 1 = Random Normal( 0, 1 );
:A sensor 2 = Random Normal( 0, 1 );
:A sensor 3 = Random Normal( 0, 1 );
);
dt << End Data Update;
// B sensors
dt << Add Rows( n_additional_rows );
dt << New Column( "B sensor 1",
Numeric,
"Continuous",
Format( "Best", 12 ),
Set Selected
) << New Column( "B sensor 2",
Numeric,
"Continuous",
Format( "Best", 12 ),
Set Selected
/*) << New Column( "B sensor 3",
Numeric,
"Continuous",
Format( "Best", 12 ),
Set Selected*/
) << Group Columns( "B sensors", {:B sensor 1, :B sensor 2}) //, :B sensor 3} )
<< Begin Data Update;
For Each Row(
dt,
:B sensor 1 = Random Normal( 0, 3 );
:B sensor 2 = Random Normal( 0, 2 );
//:B sensor 3 = Random Normal( 0, 3.5 );
);
dt << End Data Update;
colnames = dt << Get Column Names( String );
for each({col, index}, colnames,
column(dt, col) << Set Property( "child", col ) );
// Calculations.
// New formula column: Stdev[A sensor ...r 2,A sensor 3]
dt << New Column( "Stdev[A sensors]",
Numeric,
"Continuous",
Format( "Best", 12 ),
Formula( Std Dev( :A sensor 1, :A sensor 2, :A sensor 3 ) ));
// Move selected column: Stdev[A sensors]
dt <<MOVE selected="" columns=""></MOVE>
自動化とスクリプト作成