問候,
我需要幫助編寫多步驟過程的腳本,因為我無法抽像出可行的解決方案來完成一些數據準備工作。
我的時間序列數據以多個電子表格形式出現,其中包含多個選項卡,每個選項卡都包含帶有列名稱的數據,其中包含將數據置於上下文中的元數據。
在下面的示例中,帶有“描述符”的列(第 1,3 和 5 列)實際上應該命名為“日期”,但包含分析所需的描述符。此外,單位列(2,4 和 6)實際上應該命名為數據,但包含度量單位。
| 大:小:濕 | 毫克 | 壞:好:醜 | 赫茲 | 左舷:右舷:速度 | 毫升 |
| 2021年12月15日 | 0 | 2021年12月15日 | 4 | 2021年12月15日 | 8 |
| 2021年12月16日 | 1 | 2021年12月16日 | 5 | 2021年12月16日 | 9 |
| 2021年12月17日 | 2 | 2021年12月17日 | 6 | 2021年12月17日 | 10 |
| 2021年12月18日 | 3 | 2021年12月18日 | 7 | 2021年12月18日 | 11 |
理想情況下,完成的數據表應具有以下結構。
| 日期 | 描述符類型1 | 描述符類型2 | 描述符類型3 | 單元 | 數據 |
| 2021年12月15日 | 大的 | 小的 | 濕的 | 毫克 | 0 |
| 2021年12月16日 | 大的 | 小的 | 濕的 | 毫克 | 1 |
| 2021年12月17日 | 大的 | 小的 | 濕的 | 毫克 | 2 |
| 2021年12月18日 | 大的 | 小的 | 濕的 | 毫克 | 3 |
| 2021年12月15日 | 壞的 | 好的 | 醜陋的 | 赫茲 | 4 |
| 2021年12月16日 | 壞的 | 好的 | 醜陋的 | 赫茲 | 5 |
| 2021年12月17日 | 壞的 | 好的 | 醜陋的 | 赫茲 | 6 |
| 2021年12月18日 | 壞的 | 好的 | 醜陋的 | 赫茲 | 7 |
| 2021年12月15日 | 港口 | 右舷 | 速度 | 毫升 | 8 |
| 2021年12月16日 | 港口 | 右舷 | 速度 | 毫升 | 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->發短信給科爾斯...使用冒號(“:”)作為分隔符將標籤列拆分為三列。

你會得到這個:

如果您需要為此編寫腳本,因為這是您需要自動化的事情或者您經常這樣做,您可以從源腳本中獲取堆棧的腳本:
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" );
最後,“文本到列”也可以編寫腳本。
stacked_dt << Text To Columns(
delimiter( ":" ),
columns( :Label )
);