需要有关 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});
);
);