问候,
我需要帮助编写多步骤过程的脚本,因为我无法抽象出可行的解决方案来实现一些数据准备工作。
我有几个电子表格形式的时间序列数据,包含几个选项卡,每个选项卡都有列名的数据,其中包含将数据上下文化的元数据。
在下面的示例中,带有“描述符”的列(第 1,3 和 5 列)应该真正命名为“日期”,而是包含分析所需的描述符。此外,单位列(2,4 和 6)应该真正命名为数据,但包含度量单位。
| 大:小:湿 | 毫克 | 差:好:丑 | 赫兹 | 港口:右舷:速度 | 毫升 |
| 12/15/2021 | 0 | 12/15/2021 | 4 | 12/15/2021 | 8 |
| 12/16/2021 | 1 | 2021 年 12 月 16 日 | 5 | 12/16/2021 | 9 |
| 2021 年 12 月 17 日 | 2 | 12/17/2021 | 6 | 12/17/2021 | 10 |
| 12/18/2021 | 3 | 12/18/2021 | 7 | 12/18/2021 | 11 |
理想情况下,完成的数据表将具有以下结构。
| 日期 | 描述符类型 1 | 描述符类型 2 | 描述符类型 3 | 单元 | 数据 |
| 12/15/2021 | 大的 | 小的 | 湿 | 毫克 | 0 |
| 12/16/2021 | 大的 | 小的 | 湿 | 毫克 | 1 |
| 2021 年 12 月 17 日 | 大的 | 小的 | 湿 | 毫克 | 2 |
| 12/18/2021 | 大的 | 小的 | 湿 | 毫克 | 3 |
| 12/15/2021 | 坏的 | 好的 | 丑陋的 | 赫兹 | 4 |
| 12/16/2021 | 坏的 | 好的 | 丑陋的 | 赫兹 | 5 |
| 12/17/2021 | 坏的 | 好的 | 丑陋的 | 赫兹 | 6 |
| 12/18/2021 | 坏的 | 好的 | 丑陋的 | 赫兹 | 7 |
| 12/15/2021 | 港口 | 右舷 | 速度 | 毫升 | 8 |
| 12/16/2021 | 港口 | 右舷 | 速度 | 毫升 | 9 |
我尝试将列标题拉入单独的表并重新加入嵌套的 for 循环并没有成功。这是为包含的示例数据提取和准备列名称数据的代码。
Names Default to Here(1);
//Get MainDT column Names
colNames = Data Table("Data") << Get Column Names;
//Create Empty Table
dtCols = New Table("DTCols");
//Put in Columns into the table
dtCols << New Column( "Columns", Character, Values(colNames));
//Label every other row for splitting
dtCols << New Column( "Data", formula( sequence(1,2,1)));
//Remove formula from Data column
dtCols:Data << Delete Formula;
<BR />//New column from which to split from
dtCols << New Column( "Type", formula(
If(
contains(:Columns, "Desc"), "Meta",
"Unit_Raw"
);
);
);
//Deleting formula for handling
dtCols:Type << Delete formula;
//Splitting the row based on the labelling
splitdtCols = dtCols << Split(
Split By( :Type ),
Split( :Columns ),
Sort by Column Property,
Output Table( "SplitDTCols" )
);
//Text to Columns by ":"
splitdtCols << text to columns(delimiter(":"), columns(:Meta));嵌套的 for 循环(它只是看起来将完整的描述放回原始表中)不仅相对较慢(需要循环遍历 > 100 万个条目)而且它只将丢失的数据写入列中。
//Meta column back into Data
For(i = 1, i <= N Items(colNames), i++,
For(j = 1, j <= N Rows(splitdtCols), j++,
//show(splitdtCols:Meta[j]);
If( eval(char(colNames[i])) == eval(char(splitdtCols:Meta[j])),
Data Table("Data") << New Column("Descriptor", set Values(eval(char(splitdtCols:Meta[j]))))
)
)
);我愿意放弃将列名数据拉到单独的表中的方法。真的感觉我缺少一种更简单的方法。
交互式地,这很容易做到多系列堆叠.
使用 Tables->Stack 并将所有列添加到堆叠列列表。 然后单击复选框多系列堆叠. 放系列数到 2 并且不检查连续的.

你会得到一个这样的表:

重命名数据列到日期和标签 2列到单位.

然后,您可以使用 Cols->Utilities->文本到列...使用冒号 (":") 作为分隔符将 Label 列拆分为三列。

你会得到这个:

如果您需要为此编写脚本,因为这是您需要自动化的事情,或者您经常这样做,您可以从源脚本中获取堆栈的脚本:
stacked_dt = Data Table( "445470" ) << Stack(
columns(
:"Big:Small:Wet"n, :mg, :"Bad:Good:Ugly"n, :Hz, :"Port:Starboard:Speed"n,
:mL
),
Source Label Column( "Label" ),
Stacked Data Column( "Data" ),
Number of Series( 2 )
);
你需要使用<<设置名称消息以更改列的名称。
stacked_dt:"Data" << Set Name( "Date" );
stacked_dt:"Label 2" << Set Name( "Units" );
最后,Text to Columns 也是可编写脚本的。
stacked_dt << Text To Columns(
delimiter( ":" ),
columns( :Label )
);
这正是我所希望的。一些简单的东西,我忽略了。我能够很快实现这一点。