Grüße,
Ich benötige Hilfe bei der Erstellung eines Skripts für einen mehrstufigen Prozess, da ich nicht in der Lage bin, eine praktikable Lösung für die Datenvorbereitung zu finden.
Ich habe Zeitreihendaten, die in mehreren Tabellenkalkulationen mit mehreren Registerkarten vorliegen, und jede Registerkarte enthält Daten mit Spaltennamen, die Metadaten enthalten, die die Daten kontextualisieren.
Im folgenden Beispiel sollten die Spalten mit „Deskriptor“ (Spalten 1,3 und 5) eigentlich „Datum“ heißen, stattdessen aber Deskriptoren enthalten, die für die Analyse benötigt werden.Darüber hinaus sollten die Einheitenspalten (2, 4 und 6) eigentlich benannte Daten sein, aber die Maßeinheit enthalten.
| Groß: Klein: Nass | mg | Schlecht:Gut:Hässlich | Hz | Backbord: Steuerbord: Geschwindigkeit | ml |
| 15.12.2021 | 0 | 15.12.2021 | 4 | 15.12.2021 | 8 |
| 16.12.2021 | 1 | 16.12.2021 | 5 | 16.12.2021 | 9 |
| 17.12.2021 | 2 | 17.12.2021 | 6 | 17.12.2021 | 10 |
| 18.12.2021 | 3 | 18.12.2021 | 7 | 18.12.2021 | 11 |
Idealerweise hätte die fertige Datentabelle die folgende Struktur.
| Datum | DescriptorType1 | DescriptorType2 | DescriptorType3 | Einheit | Daten |
| 15.12.2021 | Groß | Klein | Nass | mg | 0 |
| 16.12.2021 | Groß | Klein | Nass | mg | 1 |
| 17.12.2021 | Groß | Klein | Nass | mg | 2 |
| 18.12.2021 | Groß | Klein | Nass | mg | 3 |
| 15.12.2021 | Schlecht | Gut | Hässlich | Hz | 4 |
| 16.12.2021 | Schlecht | Gut | Hässlich | Hz | 5 |
| 17.12.2021 | Schlecht | Gut | Hässlich | Hz | 6 |
| 18.12.2021 | Schlecht | Gut | Hässlich | Hz | 7 |
| 15.12.2021 | Hafen | Steuerbord | Geschwindigkeit | ml | 8 |
| 16.12.2021 | Hafen | Steuerbord | Geschwindigkeit | ml | 9 |
Meine Versuche, die Spaltenüberschriften in eine separate Tabelle zu ziehen und mit verschachtelten for-Schleifen wieder zusammenzuführen, waren nicht erfolgreich.Hier ist Code, der die Spaltennamendaten für die enthaltenen Beispieldaten abruft und vorbereitet.
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));Die verschachtelte for-Schleife (die nur versucht, die vollständige Beschreibung wieder in die Originaltabelle einzufügen) ist nicht nur relativ langsam (dies ist erforderlich, um mehr als 1 Million Einträge zu durchlaufen), sondern schreibt auch nur fehlende Daten in die Spalten.
//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]))))
)
)
);Ich bin bereit, den Ansatz aufzugeben, die Spaltennamendaten in eine separate Tabelle zu extrahieren.Es kommt mir wirklich so vor, als gäbe es einen einfacheren Ansatz, der mir fehlt.
Das war genau das, was ich mir erhofft hatte.Etwas Einfaches, das ich übersehen habe.Das konnte ich recht schnell umsetzen.
Interaktiv geht das ganz einfach mit a Stapel mehrerer Serien .
Verwenden Sie Tabellen->Stack und fügen Sie alle Spalten hinzu Stapelspalten Liste. Klicken Sie dann auf das Kontrollkästchen für Stapel mehrerer Serien . Satz Anzahl der Serien auf 2 und nicht überprüfen Angrenzend .

Sie erhalten eine Tabelle wie diese:

Benennen Sie die um Daten Spalte zu Datum und das Etikett 2 Spalte zu Einheiten .

Dann können Sie Cols->Utilities-> verwenden Text an Spalten... um die Label-Spalte in drei Spalten aufzuteilen, wobei ein Doppelpunkt (:) als Trennzeichen verwendet wird.

Sie erhalten Folgendes:

Wenn Sie hierfür ein Skript benötigen, weil Sie dies automatisieren müssen oder dies häufig tun, können Sie das Skript für das Stack from Source-Skript abrufen:
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 )
);
Sie müssen das verwenden < Nachricht, um die Namen der Spalten zu ändern.
stacked_dt:"Data" << Set Name( "Date" );
stacked_dt:"Label 2" << Set Name( "Units" );
Schließlich ist Text to Columns auch skriptfähig.
stacked_dt << Text To Columns(
delimiter( ":" ),
columns( :Label )
);