Ich höre regelmäßig von JMP-Benutzern, dass sie die Datentabelle mit den neuen Daten aktualisieren möchten, anstatt eine völlig neue Datentabelle zu erstellen. Dies kann verschiedene Gründe haben: Möglicherweise haben Sie bereits Daten bereinigt oder neu kodiert, möchten Ihre Arbeit und frühere Analysen in der Datentabelle gespeichert behalten oder Sie müssen einfach nur neue Daten zur vorhandenen Datentabelle hinzufügen.
In Teil 1 In dieser aus zwei Artikeln bestehenden Serie habe ich über das erste Szenario gesprochen – vertikal strukturierte Daten in einer Tabelle. Das ist nicht allzu kompliziert: Importieren Sie die neuen Daten und verketten Sie sie mit den Originaldaten (unter Berücksichtigung der bereits importierten Zeilen).
Heute möchte ich über ein zweites Szenario sprechen, das etwas komplizierter ist. Ich sehe diesen Fall ziemlich oft, wenn ich mir Kundendaten ansehe, die beispielsweise aus Laboren stammen. Die horizontale strukturierte Datentabelle:

Das heißt, die erste Zeile/erste Spalte ist der Parametername, in den folgenden Spalten sind die Daten. In der zweiten Zeile stehen die Einheiten, in der dritten Zeile die Chargennummer. Dann eine leere Zeile und danach noch einmal das Gleiche für einen anderen Parameter. Dies ist in einer Tabellenkalkulation leichter zu lesen, aber letztendlich nicht sehr einfach zu analysieren. Ich sehe diese Art von Daten oft, obwohl es viel besser wäre, den Leuten beizubringen, Daten vertikal einzugeben, als zu versuchen, mit der horizontalen Struktur umzugehen.
Wie kann man eine solche Tabelle in JMP importieren und aktualisieren? Was ist an diesen Daten so schwierig?
Wir müssen die Herausforderungen verstehen.
- Erstens sind die Daten in Zeilen angeordnet, eine größere Herausforderung besteht jedoch darin, dass es mehrere Zeilen mit ähnlichen Informationen gibt. Parameter (P1, P2, P3), Einheiten und dieselbe Chargennummer werden für jeden Parameter wiederholt
- Zweitens haben wir leere Zeilen, um die Daten zu unterteilen und so leichter interpretieren zu können, was zu was gehört
Für eine Datenanalyse ist eine solche Struktur nichts, was einer Maschine gefallen würde. Sie müssten genau angeben, wo sich welche Daten befinden, und die entsprechende Analyse durchführen. Wenn rechts neue Daten hinzugefügt werden, müssen Sie die Datenbereiche der Analyse entsprechend anpassen.
Aufgrund dieser Herausforderungen müssen wir die Daten verarbeiten, bevor wir dort ankommen, wo wir sein wollen.
Beginnen wir mit der Erstellung der Vorlagentabelle, die wir aktualisieren möchten
1. Greifen Sie auf die aktuellen Daten aus der Tabelle zu, so wie sie sind:

2. Dies ist eigentlich nicht die Tabelle, die wir haben möchten, also benennen wir sie in „help“ um und müssen die leeren Zeilen entfernen, als Vorbereitung für die Transponierung der Daten. Beim Codieren kann dies so aussehen:
dt_h1 << Set Name( name_worksheet || "help" );
// Remove rows with only missing values (break lines between measurements)
n = Loc( Column( 1 ) << Get Values, "" );
dt_h1 << Select Rows( n );
dt_h1 << Delete Rows;
- Hinweis: Ich habe den sehr nützlichen LOC-Befehl verwendet, um die leeren Zeilen zu finden, die gelöscht werden sollen
3. Die erste Spalte enthält die tatsächlichen Spaltennamen, die wir in den endgültigen Daten haben möchten. Wir möchten sie für eine spätere Verwendung speichern. Dann können wir die Tabelle transponieren und ihr den endgültigen Tabellennamen geben (als Arbeitsblatt – da ich mich auf den Tabellennamen beziehe, um automatisch das entsprechende Arbeitsblatt in der Tabelle zu finden):
// Get names used for column names after transposing the data table
NewNames = dt_h1:Column 1 << Get Values;
// Transpose Column
dt_final = Data Table( name_worksheet || "help" ) << Transpose(
columns( 1 :: N Cols( dt_h1 ) ),
Label column name( "ColName" ),
Output Table( name_worksheet )
);

4. Wir müssen nun einige Änderungen an der Datentabelle vornehmen:
- Entfernen Sie die erste Spalte
- Entfernen Sie die erste Reihe
- Ändern Sie die Spaltennamen
- Und schließlich stellen Sie die richtigen Daten- und Modellierungstypen ein (da in der ersten Zeile alles auf Zeichen gesetzt wurde) und speichern die Datei
- Entfernen Sie in diesem Beispiel auch die letzten beiden Zeilen, damit wir das Aktualisierungsskript testen können, ohne der Tabelle Spalten hinzuzufügen
- Hinweis: Basierend auf den Lokalisierungseinstellungen Ihres Systems und der Office-Sprache müssen Sie sich möglicherweise zunächst um die Voreinstellungen in JMP oder die Dezimalstellen/Kommas kümmern (z. B. mit Neukodierung), bevor Sie die Daten und den Modellierungstyp ändern
Die Abschlusstabelle sollte so aussehen:

Kümmern wir uns nun um das Update-Skript
Das meiste, was Sie benötigen, wurde bereits erledigt und automatisch in Skripten gespeichert:
- Das Importquellskript
- Das transponierte Quellskript
- Einige der oben genannten Manipulationen anhand von Skriptbeispielen
Werfen wir einen Blick auf das endgültige Update-Skript, das wir als Skript in diese Vorlagentabelle einfügen werden:
1. Arbeitsblatt mit dem Namen der aktuellen Datentabelle importieren
// Read in Sheet2 of the Excel workbook
excelFile = "TransposedExcelWorksheet.xlsx";
// Get the name of the data table and number of existing rows
cdt = Current Data Table();
cdtName = cdt << get name();
n_Rows = N Rows();
// Import the data invisible
dt_h1 = Open(
excelFile,
Worksheets( cdtName ),
Use for all sheets( 1 ),
Concatenate Worksheets( 0 ),
Create Concatenation Column( 0 ),
Worksheet Settings(
1,
Has Column Headers( 0 ),
Number of Rows in Headers( 1 ),
Headers Start on Row( 1 ),
Data Starts on Row( 1 ),
Data Starts on Column( 1 ),
Data Ends on Row( 0 ),
Data Ends on Column( 0 ),
Replicated Spanned Rows( 1 ),
Replicated Spanned Headers( 0 ),
Suppress Hidden Rows( 1 ),
Suppress Hidden Columns( 1 ),
Suppress Empty Columns( 1 ),
Treat as Hierarchy( 0 ),
Multiple Series Stack( 0 ),
Import Cell Colors( 0 ),
Limit Column Detect( 0 ),
Column Separator String( "-" )
),Invisible
);
2. Nehmen Sie die oben beschriebenen Änderungen an der Vorlagentabelle vor, transponieren Sie die Datentabelle und bereinigen Sie sie
dt_h1 << Set Name( cdtName || "help" );
// Remove rows with only missing values (break lines between measurements)
n = Loc( Column( 1 ) << Get Values, "" );
dt_h1 << Select Rows( n );
dt_h1 << Delete Rows;
// Get names used for column names after transposing the data table
NewNames = dt_h1:Column 1 << Get Values;
// Transpose Column
dt_final = Data Table( cdtName || "help" ) << Transpose(
columns( 1 :: N Cols( dt_h1 ) ),
Label column name( "ColName" ),
Output Table( cdtName )
);
// Clean up data table - delete first row of column names and first column (labels)
dt_final << Select Rows( 1 );
dt_final << Delete Rows();
Column( dt_final, "ColName" ) << Set Selected;
dt_final << Delete Columns();
// Set the Column Names appropriately based on deleted first row in this table
For( i = 1, i <= N Cols( dt_final ), i++,
col = Column( i );
col << Set Name( NewNames[i] );
);
3. Entfernen Sie bereits importierte Zeilen und hängen Sie den Rest mit concatenate an die ursprüngliche Datentabelle an:
// remove rows already imported
dt_final << Select Rows( 1 :: n_Rows );
dt_final << Delete Rows();
// Append new data to original data table
cdt << Concatenate( dt_final, Append to first table );
// Close help data table
Close( dt_final );
Close( dt_h1 );<BR />
// this last bracket is to close the whole script!
);
- Hinweis: Sie müssen sich nicht um den Daten- und Modellierungstyp kümmern, da JMP aufgrund der vorhandenen Spalteneigenschaften bereits weiß, wie die Daten zu behandeln sind.
Durch das Hinzufügen dieses Skripts zur Vorlagendatentabelle können Sie mit nur einem Knopfdruck die neuen Daten aus horizontal strukturierten Daten in einer Tabelle abrufen.
Abschluss
Dies erforderte eine ganze Reihe von Schritten, von denen einige einfach durchzuführen waren, andere schwieriger. Das Schöne ist, dass Sie es in JMP tun können. Denken Sie jedoch immer daran:
Die Datenvorbereitung erfordert die meiste Zeit, um Erkenntnisse aus Ihren Daten zu gewinnen!
Wenn Sie mit den Daten arbeiten möchten, verwenden Sie eine auf die Datenanalyse zugeschnittene Struktur.
Dabei handelt es sich meist um einen vertikalen Ansatz, bei dem jede Spalte für einen Parameter steht. Es ist aber auch ein zeilenbasierter Ansatz möglich, aber dann bitte in einem korrekten.
Um die Analyse zu erleichtern, möchte ich zwei Beispiele nennen:


- Hinweis: Durch das Hinzufügen einer neuen Spalte für den Parameternamen entfällt der Aufwand, die importierten Daten neu anzuordnen. Und Sie verfügen über eine Gruppierungsvariable, die Sie als Overlay oder nach Gruppe in den Analyseplattformen verwenden können. Dadurch wird vermieden, dass für jede Spalte dieselbe Analyse ausgeführt wird, sondern die Analyse erfolgt gleichzeitig.
Natürlich können Sie dies nutzen und erweitern, indem Sie den Daten Analysen hinzufügen, z. B. ein Kontrolldiagramm aktualisieren oder andere Trendanalysen durchführen. Mithilfe des Windows-Schedulers möchten Sie möglicherweise Ihren Bericht aktualisieren und an unser neues Produkt senden JMP Live , sodass andere Personen (nicht unbedingt lizenzierte JMP-Benutzer) mit der Interaktivität von JMP wie Datenfilter, Spaltenumschalter usw. in einem Webbrowser auf die Berichte zugreifen können.
Bitte fügen Sie gerne Ihre Anwendungsfälle und/oder Ansätze hinzu, um etwas Ähnliches zu tun. Ich schaue mir das gerne an.
Alles Gute,
Martin
PS: Drei Kommentare zu den Dateien:
- In Sheet2.jmp finden Sie ein Skript zum Aktualisieren der Datentabelle mit der angehängten Excel-Datei. Beide Dateien müssen im selben Ordner gespeichert werden (dies dient der Einfachheit, Sie können den fest codierten Dateinamen einfach ändern, z. B. mit Pick File(), und auch den Namen extrahieren.
- Das zweite Skript ist „Letzte zwei Zeilen entfernen“, das es ermöglicht, Zeilen in der Datentabelle zu entfernen, um sie erneut aus der Excel-Tabelle zu aktualisieren, ohne die Zeilen manuell löschen zu müssen. Also alles für Ihre Bequemlichkeit
- ScriptUpdateHorizontal.jsl erstellt die anfängliche Quelltabelle mit dem Aktualisierungsskript und entfernt die letzten beiden Zeilenskripte, die der Datentabelle hinzugefügt wurden. Dieses Skript bezieht sich auch auf den ersten Teil des Blogs, sodass Sie mitmachen können.