回复:按組堆疊在 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”參數。

這讓我可以完全堆疊數據,使數據具有完整的層次結構,所有數據都在一列中。
然後我按資產和索引獲取整列數據的標準偏差。 這讓我製作了這張圖:

回复:按組堆疊在 JSL 索引列中(傳感器數據和資產)這是一個好方法。 然而,完全堆疊的表格存在局限於那些具有“by”參數的公式的問題。
例如,如果我想做一個公式:(sensor 1 - sensor 2) / sensor 3,將需要堆疊表。
回复:按組堆疊在 JSL 索引列中(傳感器數據和資產)刪除回復以避免未來讀者的混淆
回复:按組堆疊在 JSL 索引列中(傳感器數據和資產)如果您有層次結構表,一種選擇是採用純 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
);

這裡做了很多假設,沒有適當的錯誤處理
回复:按組堆疊在 JSL 索引列中(傳感器數據和資產)層次結構可以作為元數據(列屬性)已經存在於表中。
我已經更新了示例,因此您在表中嵌入了父項(組)、父項別名、子項和子項別名。
我認為最直觀的方法是按資產(子集)堆疊表格,按標籤拆分數據,然後將表格連接在一起。
回复:按組堆疊在 JSL 索引列中(傳感器數據和資產)我還簡化了要求(不再有空值)並找到了需要迭代完成(每個資產)的解決方案(堆棧、拆分、連接)。 層級數據現在嵌入到主表中(進度可以在 input_example 中找到)。
回复:按組堆疊在 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>
自動化和腳本編寫