需要有關 JSL 腳本的協助,以便使用分隔符號拆分列數據,並與另一個列分隔符號匹配拆分數據大家好
我正在使用 JMP17,確實需要 JSL 腳本方面的幫助,以便將下面的輸入資料處理為所需的輸出數據
輸入資料表:
|數據|標籤 | ID |
|----------|----------|----------|
| 1_1_64_5_2 | D1_DD4_FF1_FIN1_GPES2 |蘋果1 |
| 1_1_2 | D2_D3_D4 |蘋果1 |
| 1_2_68_5_6 | D1_DD4_FF1_FIN1_GPES2 |橙色1 |
| 1_2_2 | D2_D3_D4 |橙色1 |
| 2_1_50_3_10 | D1_DD4_FF1_FIN1_GPES2 |葡萄1 |
| 2_1_2 | D2_D3_D4 |葡萄1 |
輸出格式:(列順序排列無所謂)
| ID|標籤|數據|
|----------|----------|----------|
|蘋果1 | D1 | 1 |
|蘋果1 | DD4 | 1 |
|蘋果1 | FF1 | 64 |
|蘋果1 | FIN1 | 5 |
|蘋果1 | GPES2 | 2 |
|蘋果1 | D2| 1 |
|蘋果1 | D3| 1 |
|蘋果1 | D4 | 2 |
|橙色1| D1 | 1 |
|橙色1| DD4 | 2|
|橙色1| FF1 | 68|
|橙色1| FIN1 | 5 |
|橙色1| GPES2 | 6 |
|橙色1| D2| 1 |
|橙色1| D3| 2 |
|橙色1| D4 | 2 |
|葡萄1 | D1 | 2 |
|葡萄1 | DD4 | 1|
|葡萄1 | FF1 | 50|
|葡萄1 | FIN1 | 3 |
|葡萄1 | GPES2 | 10 |
|葡萄1 | D2| 2 |
|葡萄1 | D3| 1 |
|葡萄1 | D4 | 2 |
自動化和腳本基礎資料分析與建模資料存取回覆:需要有關 JSL 腳本的協助,以便使用分隔符號拆分列數據,並與另一個列分隔符號匹配拆分數據您能提供範例表嗎?僅從文字來了解起始情況有點困難。
回覆:需要有關 JSL 腳本的協助,以便使用分隔符號拆分列數據,並與另一個列分隔符號匹配拆分數據我假設所有的標籤和資料值都有相同數量的項目。如果是這樣,那就可以了。如果沒有,則需要添加一些邏輯來檢查,但這是一種快速處理資料的方法。
// this would be whatever your input table name is<BR />dt0 = Data table("Input Table");
dt1 = new table("Output table");
dt1<<NEW column=""></NEW>回覆:需要有關 JSL 腳本的協助,以便使用分隔符號拆分列數據,並與另一個列分隔符號匹配拆分數據我不確定起點是什麼,所以我假設你有一個數據表而不是文字檔案。

選擇資料和標籤列並使用文字到列

刪除那些“舊”列(或將它們移至末尾)。
接下來使用多個系列堆疊堆疊您的數據

刪除多餘的列、重新排序和重新命名列

刪除缺失行

驗證結果並採用 JMP 為您建立的腳本(或工作流程)。
工作流程也附加(可能需要一些清理)並根據以下工作流程清理腳本(可以根據您的需求變得更加強大):
看更多...
Names Default To Here(1);
dt = Current Data Table();
dt << Text to Columns(columns(:" Data"n, :Label), Delimiters("_"));
dt << Delete Columns(:" Data"n, :Label);
dt_stacked = dt << Stack(
columns(:Data 1, :Data 2, :Data 3, :Data 4, :Data 5, :Label 1, :Label 2, :Label 3, :Label 4, :Label 5),
Number of Series(2),
Contiguous,
Output Table("Stacked result")
);
dt_stacked << Delete Columns(:Label, :Label 2);
Column(dt_stacked, "Data 2") << Set Name("Label");
dt_stacked << Move Selected Columns({:Label}, after(:ID));
dt_stacked << Select Where(:Label == "") << Delete Rows;
回覆:需要有關 JSL 腳本的協助,以便使用分隔符號拆分列數據,並與另一個列分隔符號匹配拆分數據我建議進行以下幾點改進:
- 一般不要使用當前資料表()。在這種情況下,您可以使用它來選擇初始表,但您不需要繼續更改它,因為您已經有了引用(例如當前資料表(dt1);是不必要的並且可能會導致問題)
- 使用 For Each Row 時循環遍歷特定表,而不依賴當前表(對於每一行(dt0,...)
- 您也可以使用 For Each + Across 循環遍歷多個容器。您也可以在使用 Across 處理不同長度的容器時強制不同的行為
- 如果您知道列名 + 值,則可以使用 << 新增行 新增值,但這可能會很混亂(通常我會像您一樣新增行,然後再新增值)
看更多...
Names Default To Here(1);
dt_input = Current Data Table();
// dt_input = Data table("Input Table");
dt_result = New Table("Output table");
dt_result << New Column("ID", Character, Nominal);
dt_result << New column("Label", Character, Nominal);
dt_result << New Column("Data", Character, Nominal);
For Each Row(dt_input,
id_val = Column(dt_input, "ID")[];
data_vals = Words(Column(dt_input, "Data")[], "_");
label_vals = Words(Column(dt_input, "Label")[], "_");
For Each({{cur_label, cur_data}}, Across(label_vals, data_vals),
dt_result << Add Rows({ID = id_val, Label = cur_label, Data = cur_data});
);
);