Einführung
Die meisten unserer Daten in der Forschung und Entwicklung stammen aus Datenbanken, Excel- oder CSV-Dateien oder werden direkt in JMP eingegeben. Unterstützende Daten liegen jedoch häufig in anderen Formaten vor, insbesondere in PDF-Dateien. Denken Sie beispielsweise an chemische Referenztabellen, Lieferanteninformationsblätter oder sogar historische Unternehmensdaten, die jetzt nur noch als PDF vorliegen. Diese Art von unterstützenden Informationen kann sehr hilfreich sein, um experimentelle Daten zu ergänzen, und glücklicherweise verfügt JMP über einen PDF-Importassistenten, der den Import dieser Art von Daten ermöglicht. Da diese Tabellen nicht für Statistiksoftware wie JMP formatiert wurden, führt der Import von Daten aus PDFs häufig zu unübersichtlichen Datentabellen, die manchmal zusätzliche Bereinigungsschritte erfordern.
In meiner F&E-Vergangenheit kannte ich den PDF-Importassistenten in JMP und habe ihn manchmal verwendet. Es gab auch Fälle, in denen ich PDF-Daten zur Ergänzung meines Forschungsprojekts fand, aber nicht herausfinden konnte, wie ich die Tabelle nach dem Importieren der Daten in JMP bereinigen sollte. In diesen Fällen musste ich das Projekt aufgeben und auf die zusätzlichen Informationen verzichten, was sehr frustrierend war.
Ein paar Jahre später habe ich das Gefühl, dass ich die Werkzeuge habe, um mit jeder PDF-Datei umzugehen, egal wie chaotisch die Daten nach dem Import sind. Wie bei vielen chaotischen Datenproblemen sind Spaltenformeln die beste Lösung, um importierte PDF-Daten zu bereinigen. Dies gilt insbesondere, wenn die Schritte im Workflow Builder aufgezeichnet werden oder wenn das Skript erfasst werden soll, um den Prozess zu automatisieren.
Wer sollte diesen Blog lesen?
Lesen Sie weiter, wenn Sie:
- Möchten Sie mehr über die Grundlagen des PDF-Importassistenten erfahren?
- Sie kommen nach dem Importieren von PDF-Daten nicht weiter mit der Datenbereinigung
- Möchten Sie mehr über die Verwendung von Flag-Spalten und Spaltenindizes zum Bereinigen von Daten erfahren?
- Möchten Sie erfahren, wie Sie DPF-Bereinigungsschritte über mehrere Seiten hinweg schleifen können?
Beachten Sie, dass Sie nicht alles durchlesen müssen, sondern weiter unten direkt zu dem Abschnitt springen können, der Sie interessiert.
Überblick
Beim Bereinigen von aus PDFs importierten Daten stoße ich immer wieder auf zwei Konstrukte, die ich entweder einzeln oder in Kombination verwende. Diese sind:
- Markierungsspalten: Erstellen einer binären Markierung, um Zeilen zu identifizieren, die ein bestimmtes Kriterium erfüllen. Dies kann „fehlend vs. nicht fehlend“, „Null“ vs. „nicht Null“ usw. sein. Markierungsspalten können auch in Verbindung mit der Auswahl von Zeilen basierend auf einer Bedingung verwendet werden.
- Zeilenindizes: Vergleichen Sie eine Zelle mit der nächsten (oder der vorherigen) und verwenden Sie dies, um eine Markierungsspalte zu generieren oder um Zellenwerte aus aufeinanderfolgenden Zellen zu verketten. Verwenden Sie Row(), Row() +1, Row()-1 als Spaltenindizes (verwendet zwischen Indexklammern „[ ]“).
Ich habe auch eine Reihe hilfreicher Formeln, die ich oft verwende.
Hilfreiche Formeln:
- Fehlt()
- Enthält()
- Wenn ()
- Länge()
- Verketten („||“)
In diesem Blogbeitrag untersuche ich die folgenden Arten von Problemen, die typischerweise mit dem Importieren von PDF-Daten verbunden sind:
Zu jedem Thema finden Sie sowohl eine kurze Diskussion als auch ein Video.
Bevor wir uns diese Probleme und ihre Bereinigung ansehen, denken Sie daran, dass es in JMP fast immer mehrere Wege gibt, um zum selben Endergebnis zu gelangen. Ich werde jedoch Lösungen auswählen, die im Workflow Builder aufgezeichnet werden, damit die Bereinigungsschritte mit einem Workflow wiederholbar sind. Normalerweise bedeutet dies, dass ich Formelspalten anstelle der „schnelleren“ Rechtsklickoption (falls verfügbar) verwende oder eine Add-In-Option verwende. Wenn ich die Bereinigungsschritte so einrichte, dass jeder Schritt aufgezeichnet wird, kann ich den Workflow auf andere Datentabellen anwenden, die genau dieselben Bereinigungsschritte erfordern. Sehen Sie sich beispielsweise das letzte Beispiel einer PDF-Tabelle an, die sich über 13 Seiten erstreckt. Beim Importieren dieser PDF-Datei in JMP werden 13 Tabellen erstellt. Wie Sie im letzten Video sehen können, habe ich die Bereinigungsschritte für die erste Tabelle mit Formelspalten aufgezeichnet und dann die Bereinigungsschritte in JMP wiederholt, um sie auf alle 13 Tabellen anzuwenden (durchgeführt mit der Funktion „Gruppieren mit For Each“ im Workflow Builder in JMP 18), was die Bereinigung der 13 Tabellen einfach macht! Springen Sie hier zu den Videos mit den Workflow Builder-Looping-Beispielen.
Beginnen wir mit einem einfachen Beispiel. Wenn Sie mit dem PDF-Importassistenten in JMP nicht vertraut sind, sehen Sie sich zunächst dieses Video an, um zu sehen, wie ich den Importassistenten verwende, um Daten aus diesem PDF in JMP zu importieren.
Problem 1: Fehlende Zellenwerte aufgrund zusammengeführter Zeilenüberschriften im PDF.
Tabellen in PDF-Dateien sind oft so formatiert, als wären mehrere Zeilen zusammengeführt und enthalten einen einzelnen Wert, beispielsweise eine Unterüberschrift. Beim Importieren in JMP enthält die Tabelle leere Zeilen, anstatt den Wert für jede Zeile mit Daten zu wiederholen (Abbildung 1).
Figure 1: Missing cell values in JMP (right side of image) due to merged row subheaders (left side of image).Figure 1: Missing cell values in JMP (right side of image) due to merged row subheaders (left side of image).Figure 1: Missing cell values in JMP (right side of image) due to merged row subheaders (left side of image).Figure 1: Missing cell values in JMP (right side of image) due to merged row subheaders (left side of image).Abbildung 1: Fehlende Zellenwerte in JMP (rechte Seite des Bildes) aufgrund zusammengeführter Zeilenunterüberschriften (linke Seite des Bildes).
Eine schnelle Lösung für die Bereinigung besteht darin, die Spalte mit den fehlenden Werten auszuwählen (z. B. Spalte 3 in Abbildung 1), dann mit der rechten Maustaste auf eine Zelle zu klicken und „Füllen“ und anschließend „Fehlende durch vorherigen Wert ersetzen “ auszuwählen. In allen Versionen von JMP bis JMP 18 wird diese Rechtsklick-Aktion noch nicht im Workflow Builder oder im erweiterten Protokoll aufgezeichnet. Sie wird in JMP 19 hinzugefügt, aber für frühere Versionen besteht eine robustere Option zum Ersetzen fehlender Zellenwerte durch den vorherigen Wert, der im Workflow Builder oder im erweiterten Protokoll aufgezeichnet wird, in der Verwendung einer Spaltenformel. Ich habe eine Spaltenformel verwendet, die in der Formel selbst eine Variable namens „var“ zuweist, wenn Spalte 3 nicht fehlt, und dann diesen Wert für den nächsten fehlenden Wert verwendet (Abbildung 2). Diese Methode eignet sich gut zum Ersetzen vorheriger Werte, da die Spaltenformel von oben nach unten ausgeführt wird. Mit anderen Worten: Jedes Mal, wenn sich ein Wert in Spalte 3 befindet, wird die Variable „var“ aktualisiert und der aktualisierte Wert wird für nachfolgende Zeilen verwendet, bis eine neue Aktualisierung für eine nicht fehlende Zeile erfolgt.
Figure 2: Replacing missing with previous value column formula.Figure 2: Replacing missing with previous value column formula.Figure 2: Replacing missing with previous value column formula.Figure 2: Replacing missing with previous value column formula. Abbildung 2: Ersetzen fehlender Werte durch vorherige Spaltenformel.
Sehen Sie, wie ich diesen Schritt im nächsten Video demonstriere:
Problem 2a: Der Zellenwert ist auf mehrere Zeilen aufgeteilt
Ein weiteres Beispiel für zusammengeführte Zeilen in einer PDF-Tabelle, die in JMP bereinigt werden müssen, ist, wenn ein Wert, etwa eine Unterüberschrift, auf mehrere Zeilen in einer Spalte aufgeteilt ist (Abbildung 3).
Figure 3: A cell value, in this case a category subheader (left), is split over multiple rows on import to JMP (right).Figure 3: A cell value, in this case a category subheader (left), is split over multiple rows on import to JMP (right).Figure 3: A cell value, in this case a category subheader (left), is split over multiple rows on import to JMP (right).Figure 3: A cell value, in this case a category subheader (left), is split over multiple rows on import to JMP (right).Abbildung 3: Ein Zellenwert, in diesem Fall eine Kategorie-Unterüberschrift (links), wird beim Import in JMP auf mehrere Zeilen aufgeteilt (rechts).
Um dies zu bereinigen, müssen die Teile der Zeichenfolgen identifiziert und dann aneinandergereiht werden. Die gesamte Zeichenfolge muss für die entsprechenden Zeilen wiederholt werden und dann müssen die verbleibenden Teilzeichenfolgen gelöscht werden. Eine Möglichkeit, dieses Problem zu lösen, besteht darin, eine Flag-Spalte zu erstellen, die fehlende von nicht fehlenden oder „nächste Zeile fehlt“ von „nächste Zeile nicht fehlt“ unterscheidet. Für das Beispiel in Abbildung 3 ist die folgende Abfolge von Schritten möglich (alle sind in Abbildung 4 dargestellt):
- Identifizieren Sie Zeilen mit Text und Zeilen ohne Text mit einer Flag-Spalte (Schritt 1).
- Verwenden Sie die Spalte „Flag“ und eine Formel mit Zeilenindizes, um Zeilen mit Text zu identifizieren und mit dem Text in der nächsten Zeile zu verknüpfen (Schritt 2).
- Sobald Zellen mit der vollständigen Zeichenfolge vorhanden sind, erstellen Sie eine Markierungsspalte, um die Zeilen mit teilweisen Textzeichenfolgen zu identifizieren, und löschen Sie diese teilweisen Zeichenfolgen (Schritte 3 und 4).
Ersetzen Sie fehlende Werte für leere Zellen durch die gesamte Zeichenfolge (siehe Lösung für Problem 1).
Im Beispiel von Abbildung 3 habe ich die in Abbildung 4 gezeigten Formeln verwendet.
Figure 4: Series of column formulas to find and correct a subheader split over two rows.Figure 4: Series of column formulas to find and correct a subheader split over two rows.Figure 4: Series of column formulas to find and correct a subheader split over two rows.Figure 4: Series of column formulas to find and correct a subheader split over two rows.Abbildung 4: Reihe von Spaltenformeln zum Suchen und Korrigieren einer auf zwei Zeilen aufgeteilten Unterüberschrift.
Hier können Sie sehen, wie ich diese Schritte demonstriere:
Problem 2b: Der Zellenwert ist auf mehrere Spalten aufgeteilt
Für das nächste Beispiel verwende ich eine andere PDF-Datei, die ich hier gefunden habe. In diesem Fall sind die Zellenwerte auf zwei Zeilen UND zwei Spalten aufgeteilt. Sehen Sie sich das linke Bild in Abbildung 5 an. In diesem Beispiel ist der chemische Name „Oxy-1,4-phenylenesulfonyl-1,4-phenyleneoxy-1,4-phenelyneisopropylidene-1,4-phenylene“ (angezeigt durch das blaue Kästchen) nicht nur auf zwei Zeilen, sondern auch auf zwei Spalten aufgeteilt. Das liegt daran, dass weiter oben in der Tabelle zwei Werte für die Glasübergangstemperatur Tg statt einem angegeben sind, wodurch ein Spaltenteiler weder den chemischen Namen noch die Tg-Werte schneiden kann (siehe rote vertikale Spaltentrenner).
Figure 5: Thermal Transitions table demonstrating a cell value that is split over multiple columns and rows.Figure 5: Thermal Transitions table demonstrating a cell value that is split over multiple columns and rows.Figure 5: Thermal Transitions table demonstrating a cell value that is split over multiple columns and rows.Figure 5: Thermal Transitions table demonstrating a cell value that is split over multiple columns and rows.Abbildung 5: Tabelle „Thermische Übergänge“ zeigt einen Zellenwert, der auf mehrere Spalten und Zeilen aufgeteilt ist.
(Quelle: https://www3.nd.edu/~hgao/thermal_transitions_of_homopolymers.pdf)
Wenn der Spaltenteiler wie im linken Bild von Abbildung 5 dargestellt platziert ist, gibt es in der Spalte Tg zwei Zellen mit abgeschnittenem Text, der in die Spalte „Wiederholende Einheit“ gehört. In diesem Fall können wir die Tatsache nutzen, dass der abgeschnittene Text aus Buchstaben besteht, statt aus den Zahlen, die in den anderen Zellen stehen. Daher besteht eine Möglichkeit, dieses Problem zu beheben, darin, die folgenden Schritte auszuführen, wie in Abbildung 6 dargestellt:
- Erstellen Sie eine Spalte mit dem ersten Zeichen (Schritt 1).
- Verwenden Sie die Option „Zeichenfolge ersetzen“ der Recode-Plattform, um alles, was eine Zahl ist, durch nichts zu ersetzen. Dazu habe ich den regulären Ausdruck [0-9-] verwendet, um alle Zahlen einschließlich des „-“ zu finden. (Schritt 2).
- Verwenden Sie die Formel „Ismissing“, um die Textzeichenfolge zu lokalisieren und sie mit der ursprünglichen (abgeschnittenen) Zeichenfolge zu verketten (Schritt 3).
- Bereinigen Sie die Spalte Tg mithilfe von bedingten Anweisungen und der Spalte Text Flag. Diese Methode ist zwar etwas umständlich, funktioniert aber. Wenn Sie einen regulären Ausdruck kennen, können Sie diesen auch hier unter der Spaltenoption „Neu kodieren“ verwenden. Ich habe die in Abbildung 7 gezeigten bedingten Anweisungen verwendet.
Nach all dieser Bereinigung habe ich festgestellt, wo der Zellinhalt vertikal auf zwei Zeilen aufgeteilt ist: Zeilen 39/40, 41/42 und 43/44. Bei den aufgeteilten Zellen endet der erste Teil der Zeichenfolge mit einem „-“, sodass dies als Indikator verwendet werden kann. Als Nächstes kann eine Formelkonstruktion wie die in Abbildung 4 gezeigte verwendet werden, um die Textzeichenfolgen zusammenzufügen. Schließlich können leere Datenzellen gelöscht werden, um doppelte Zeilen zu vermeiden.
Figure 6: Finding and concatenating split text strings.Figure 6: Finding and concatenating split text strings.Figure 6: Finding and concatenating split text strings.Figure 6: Finding and concatenating split text strings.Abbildung 6: Suchen und Verketten geteilter Textzeichenfolgen.
Figure 7: Removing text string from numbers column.Figure 7: Removing text string from numbers column.Figure 7: Removing text string from numbers column.Figure 7: Removing text string from numbers column.Abbildung 7: Entfernen einer Textzeichenfolge aus der Zahlenspalte.
Das nächste Video zeigt, wie ich diese Schritte verwendet habe, damit Sie eine mögliche Lösung für dieses Problem sehen können.
Problem 3: Zeilen mit Überschriften oder Unterüberschriften werden mit den Daten vermischt
Für das letzte Beispiel gehe ich zurück zum PDF, in dem die Fettsäurezusammensetzungen für Fette aufgelistet sind. In diesem Fall können Sie sehen, dass die Datentabelle Zeilen mit Überschriften, Einheiten oder Unterüberschriften enthält, die beim Importieren in JMP nun mit den Daten vermischt werden (Abbildung 8).
Eine Möglichkeit, solche Zeilen zu identifizieren, besteht darin, die Formel „Enthält“ zu verwenden, um ein Symbol oder eine Textzeichenfolge in der Kopfzeile/Einheitszeile zu identifizieren, das/die in den tatsächlichen Daten nicht enthalten ist. In Abbildung 8 verwenden wir beispielsweise die Formel „Enthält(„%“)“. Diese Formel ergibt entweder eine „0“, wenn dieses Symbol nicht in der Zelle vorkommt, oder an der tatsächlichen Position des Zeichens in der Zeichenfolge (was zu einer Ganzzahl > 0 führt). Mit einer einfachen bedingten Anweisung kann eine Flag-Spalte generiert werden.
Für dieses Beispiel wird in Abbildung 9 eine mögliche Formel angezeigt. Um die Zeilen mit einer „1“ (was bedeutet, dass das „%“ vorhanden ist) zu entfernen, wählen Sie Zeilen aus, die dieses Kriterium erfüllen, indem Sie die Option „Wo auswählen“ im Menü „Zeile/Zeilenauswahl“ verwenden (Abbildung 10). Löschen Sie anschließend die ausgewählten Zeilen. Das erweiterte Protokoll und der Workflow Builder erfassen diese Abfolge von Schritten und können sie für die wiederholte Verwendung automatisieren. Beachten Sie, dass im Menü „Wo auswählen“ eine begrenzte Anzahl von Auswahlkriterien direkt verfügbar ist, darunter „Enthält“. Sie können dies also direkt einrichten und auf die Spalte „Flag“ verzichten.
Figure 8: Rows with headers or subheaders are mixed in with the data and appear as rows in the JMP table.Figure 8: Rows with headers or subheaders are mixed in with the data and appear as rows in the JMP table.Figure 8: Rows with headers or subheaders are mixed in with the data and appear as rows in the JMP table.Figure 8: Rows with headers or subheaders are mixed in with the data and appear as rows in the JMP table. Abbildung 8: Zeilen mit Überschriften oder Unterüberschriften werden mit den Daten vermischt und erscheinen als Zeilen in der JMP-Tabelle.
Figure 9: Conditional statement with "Contains" formula to create a Flag column that identifies if the "%" character is present.Figure 9: Conditional statement with "Contains" formula to create a Flag column that identifies if the "%" character is present.Figure 9: Conditional statement with "Contains" formula to create a Flag column that identifies if the "%" character is present.Figure 9: Conditional statement with "Contains" formula to create a Flag column that identifies if the "%" character is present.Abbildung 9: Bedingte Anweisung mit der Formel „Enthält“ zum Erstellen einer Flag-Spalte, die angibt, ob das Zeichen „%“ vorhanden ist.
Figure 10: Adding conditional row selection criteria using a Flag column.Figure 10: Adding conditional row selection criteria using a Flag column.Figure 10: Adding conditional row selection criteria using a Flag column.Figure 10: Adding conditional row selection criteria using a Flag column.Abbildung 10: Hinzufügen bedingter Zeilenauswahlkriterien mithilfe einer Flag-Spalte.
In diesem Video sehen Sie die Bereinigungsschritte zum Identifizieren und Entfernen unerwünschter Zeilen in der Datentabelle (in diesem Fall der Unterüberschriftenzeilen).
Bonusvideos: Importbeispiele mit WorkflowBuilder-Schleife
In diesem Video sehen Sie, wie alle für die erste Seite durchgeführten Bereinigungsschritte mit nur wenigen Klicks auf eine zweite Seite angewendet werden können. Ich verwende die Schleife „Gruppieren mit For Each“ im Workflow Builder für das in der obigen Diskussion gezeigte fat.pdf-Beispiel. Als Nächstes zeige ich einen extremeren Fall, bei dem ich 13 Seiten in einem breiten Tabellenformat habe. Jede Seite muss separat importiert und bereinigt werden. Nachdem ich jedoch den PDF-Importassistenten verwendet habe, um die Tabelle von jeder Seite zu importieren, kann ich einfach die Bereinigungsschritte für eine Tabelle aufzeichnen. Ich kann dann die Option „Gruppieren mit For Each“ im Workflow Builder verwenden, um die Bereinigungsschritte automatisch für die anderen 12 auszuführen! Wie effizient ist das denn!?!
Abschließend möchte ich sagen, dass ich mir hundertprozentig sicher bin, dass es kürzere oder elegantere Möglichkeiten gibt, einige dieser Probleme zu lösen, die ich noch nicht kenne. Teilen Sie uns gerne weitere Lösungen in den Kommentaren unten mit.