ご挨拶、
いくつかのデータ準備作業を達成するための実行可能なソリューションを抽象化することができないため、マルチステッププロセスのスクリプト作成の支援が必要です。
複数のタブを含む複数のスプレッドシートとして提供される時系列データがあり、各タブには、データをコンテキスト化するメタデータを含む列名のデータがあります。
以下の例では、「記述子」のある列(列1、3、および5)は、実際には「日付」という名前にする必要がありますが、代わりに分析に必要な記述子が含まれています。さらに、単位列(2、4、および6)は、実際にはデータという名前にする必要がありますが、測定単位が含まれています。
| 大きい:小さい:濡れている | mg | 悪い:良い:醜い | Hz | 左舷:右舷:速度 | mL |
| 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 |
理想的には、完成したデータテーブルは次の構造になります。
| 日にち | DescriptorType1 | DescriptorType2 | DescriptorType3 | 単位 | データ |
| 2021年12月15日 | 大きい | 小さい | 濡れた | mg | 0 |
| 2021年12月16日 | 大きい | 小さい | 濡れた | mg | 1 |
| 2021年12月17日 | 大きい | 小さい | 濡れた | mg | 2 |
| 2021年12月18日 | 大きい | 小さい | 濡れた | mg | 3 |
| 2021年12月15日 | 悪い | 良い | 醜い | Hz | 4 |
| 2021年12月16日 | 悪い | 良い | 醜い | Hz | 5 |
| 2021年12月17日 | 悪い | 良い | 醜い | Hz | 6 |
| 2021年12月18日 | 悪い | 良い | 醜い | Hz | 7 |
| 2021年12月15日 | ポート | 右舷 | スピード | mL | 8 |
| 2021年12月16日 | ポート | 右舷 | スピード | mL | 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]))))
)
)
);列名データを別のテーブルに引き出すというアプローチはやめたいと思います。私が見逃しているより単純なアプローチがあるように本当に感じます。
インタラクティブにこれを行うのは簡単です複数のシリーズスタック。
[テーブル]-> [スタック]を使用して、すべての列をスタック列リスト。 次に、のチェックボックスをクリックします複数のシリーズスタック。 セットするシリーズ数2に、チェックしないでください隣接。

次のようなテーブルが表示されます。

名前を変更しますデータ列から日にちそしてそのラベル2列から単位。

次に、[列]-> [ユーティリティ]->を使用できますColsへのテキスト...区切り文字としてコロン( ":")を使用して、ラベル列を3つの列に分割します。

あなたはこれを得るでしょう:

これをスクリプト化する必要がある場合、これは自動化する必要があるものであるか、これを頻繁に行うため、ソーススクリプトからスタックのスクリプトを取得できます。
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 toColumnsもスクリプト可能です。
stacked_dt << Text To Columns(
delimiter( ":" ),
columns( :Label )
);
これはまさに私が望んでいたことでした。シンプルで見落としていたもの。私はこれをかなり迅速に実装することができました。