導入
R&D におけるデータのほとんどは、データベース、Excel または CSV ファイルから取得されるか、JMP に直接入力されます。ただし、サポート データは他の形式、特に PDF ファイルで提供されることがよくあります。たとえば、化学物質参照表、ベンダー情報シート、または現在は PDF でしか存在しない過去の企業データなどです。このようなサポート情報は、実験データを補完するのに非常に役立ちます。ありがたいことに、JMP には、このタイプのデータをインポートできる PDF インポート ウィザードがあります。これらのテーブルは JMP などの統計ソフトウェア用にフォーマットされていないため、PDF からデータをインポートすると、乱雑なデータ テーブルになることが多く、場合によっては追加のクリーンアップ手順が必要になります。
研究開発に携わっていた頃、JMP の PDF インポート ウィザードがあることは知っていて、時々使用していました。研究プロジェクトを補強するために PDF データを見つけたものの、JMP にデータをインポートした後、テーブルをクリーンアップする方法がわからなかったこともありました。そのような場合、プロジェクトを断念して追加情報をあきらめざるを得ず、非常にイライラしました。
それから数年が経ち、今では、インポート後のデータがどんなに乱雑であっても、あらゆる PDF ファイルに対応できるツールを手に入れたと感じています。乱雑なデータの問題の多くと同様に、インポートした PDF データを整理するには、列の式が最適です。これは、ワークフロー ビルダーで手順を記録する場合や、プロセスを自動化するためにスクリプトをキャプチャする必要がある場合に特に当てはまります。
このブログを読むべき人は誰でしょうか?
以下の条件に当てはまる場合は、読み進めてください。
- PDFインポートウィザードの基本について詳しく知りたい
- PDFデータをインポートした後、データのクリーンアップで行き詰まっています
- フラグ列と列の添え字を使用してデータをクリーンアップする方法について詳しく知りたい
- 複数のページにわたって DPF クリーンアップ手順をループする方法を知りたい
すべてを読む必要はなく、以下の興味のあるセクションにジャンプできます。
概要
PDF からインポートしたデータをクリーンアップするときに、私は 2 つの構成要素に戻ってきます。これらを単独で、または組み合わせて使用します。これらは次のとおりです。
- 列にフラグを付ける:特定の基準を満たす行を識別するためのバイナリ フラグを作成します。「欠落している vs 欠落していない」、「ゼロ」 vs 「ゼロではない」などです。列にフラグを付ける機能は、条件に基づいて行を選択する際にも使用できます。
- 行の添え字: 1 つのセルを次のセル (または前のセル) と比較し、これを使用してフラグ列を生成したり、連続するセルのセル値を連結したりします。列の添え字として Row()、Row() +1、Row()-1 を使用します (添え字の括弧「[ ]」で囲んで使用します)。
私もよく使う便利な数式をいくつか持っています。
役立つ数式:
- 欠落しています()
- 含む()
- もし ()
- 長さ()
- 連結 (“||”)
このブログ記事では、PDF データのインポートに通常関連する次の種類の問題について検討します。
各トピックごとに、短いディスカッションとビデオの両方が見つかります。
これらの問題とそのクリーンアップ方法を検討する前に、JMP ではほとんどの場合、同じ最終結果に到達する方法が複数あることを覚えておいてください。ただし、ワークフロー ビルダーに記録されているソリューションを選択して、ワークフローでクリーンアップ手順を繰り返すことができるようにします。通常、これは、より速い右クリック オプション (使用可能な場合) の代わりに数式列を使用するか、アドイン オプションを使用することを意味します。各ステップが記録されるようにクリーンアップ手順を設定すると、まったく同じクリーンアップ手順が必要な他のデータ テーブルでワークフローを使用できます。たとえば、13 ページにまたがる PDF テーブルの最後の例を確認してください。この PDF を JMP にインポートすると、13 個のテーブルが作成されます。最後のビデオでわかるように、数式列を含む最初のテーブルのクリーンアップ手順を記録し、JMP でクリーンアップ手順をループして 13 個のテーブルすべてに適用しました (JMP 18 のワークフロー ビルダーのFor Each 関数を使用して実行)。これにより、13 個のテーブルを簡単にクリーンアップできます。ここから、ワークフロー ビルダーのループ例を含むビデオにジャンプします。
簡単な例から始めましょう。JMP の PDF インポート ウィザードに慣れていない場合は、まずこのビデオを見て、インポート ウィザードを使用してこの PDF からデータを JMP に取り込む方法を確認してください。
問題 1: PDF 内の行ヘッダーが結合されているため、セル値が欠落しています。
多くの場合、PDF ファイル内の表は、複数の行が結合され、サブヘッダーなどの単一の値が含まれているかのようにフォーマットされています。JMP にインポートすると、データを含む各行の値が繰り返されるのではなく、表に空の行が表示されます (図 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).図 1: 行のサブヘッダーが結合されたために JMP でセルの値が欠落している (画像の右側)。
クリーンアップの簡単な解決策の 1 つは、欠損値のある列 (図 1 の列 3 など) を選択し、セルを右クリックして[塗りつぶし]を選択し、次に[欠損値を前の値で置換]を選択することです。JMP 18 までのすべてのバージョンの JMP では、この右クリック操作はワークフロー ビルダーまたは詳細ログにまだ記録されません。これは JMP 19 で追加されますが、それより前のバージョンでは、欠損セル値をワークフロー ビルダーまたは詳細ログに記録されている前の値に置き換えるより堅牢なオプションは、列式を使用することです。私は、列 3 が欠損していない場合に数式自体で「var」という変数を割り当て、次の欠損値にこの値を使用する列式を使用しました (図 2)。この方法は、列式が上から下に実行されるため、前の値を置き換えるのに適しています。つまり、列 3 に値があるたびに、変数「var」が更新され、欠損していない行で新しい更新が行われるまで、更新された値が後続の行に使用されます。
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.図 2: 欠損値を前の値に置き換える列の数式。
次のビデオでこの手順のデモンストレーションをご覧ください。
問題 2a: セルの値が複数の行に分割されている
PDF テーブル内の結合された行を JMP でクリーンアップする必要があるもう 1 つの例は、サブヘッダーなどの値が 1 つの列内の複数の行に分割されている場合です (図 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).図 3: セル値 (この場合はカテゴリ サブヘッダー (左)) は、JMP へのインポート時に複数の行に分割されます (右)。
これをクリーンアップするには、文字列の部分を識別してつなぎ合わせる必要があります。文字列全体を適切な行に繰り返し、残りの部分的な文字列を削除する必要があります。この問題を解決する 1 つの方法は、欠落と非欠落を識別するフラグ列、または「次の行が欠落」と「次の行が欠落していない」を識別するフラグ列を作成することです。図 3 の例では、次の一連の手順が考えられます (すべて図 4 に示されています)。
- フラグ列を使用して、テキストがある行とテキストがない行を識別します (手順 1)。
- フラグ列と行の添え字を含む数式を使用して、テキストを含む行を識別し、次の行のテキストと連結します (手順 2)。
- 文字列全体を含むセルができたら、部分的なテキスト文字列を含む行を識別するフラグ列を作成し、これらの部分的な文字列を削除します (手順 3 および 4)。
空のセルの欠損値を文字列全体で置き換えます (問題 1 の解決策を参照)。
図 3 の例では、図 4 に示す数式を使用しました。
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.図 4: 2 行に分割されたサブヘッダーを見つけて修正するための一連の列数式。
ここでこれらの手順のデモンストレーションを見ることができます:
問題 2b: セルの値が複数の列に分割されている
次の例では、 ここで見つけた別の PDF ファイルを使用します。この場合、セルの値は 2 行 2 列に分割されます。図 5 の左側の画像を見てください。この例では、化学名「Oxy-1,4-phenylenulfonyl-1,4-phenylenoxy-1,4-phenelyneisopropilidene-1,4-phenylenene」(青いボックスで示されています)は、2 行だけでなく 2 列にも分割されています。これは、表の上の方で、ガラス転移 Tg の値が 1 つではなく 2 つリストされているため、列の区切り線で化学名または Tg 値のいずれかを切り取らずに済ませることができなかったために発生しました(赤い縦の列の区切り線を参照)。
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.図 5: 複数の列と行に分割されたセル値を示す熱遷移テーブル。
(出典: https
/www3.nd.edu/~hgao/thermal_transitions_of_homopolymers.pdf)
図 5 の左側の画像に示すように、列区切り線が配置されている場合、Tg 列には、繰り返し単位列に属する切り捨てられたテキストを持つセルが 2 つあります。この場合、切り捨てられたテキストが他のセルにある数字ではなく文字であるという事実を利用できます。したがって、この問題を修正する 1 つの方法は、図 6 に示すように、次の手順に従うことです。
- 最初の文字で列を作成します (手順 1)。
- Recode プラットフォームの [文字列の置換] オプションを使用して、数字を何もないものに置き換えます。このために、正規表現 [0-9-] を使用して、「-」を含むすべての数字を検索しました。(手順 2)。
- 「Ismissing」数式を使用してテキスト文字列を見つけ、それを元の(切り取られた)文字列と連結します(手順 3)。
- 条件文とテキスト フラグ列を使用して、Tg 列をクリーンアップします。この方法は少し扱いにくいですが、目的を果たします。正規表現がわかっている場合は、ここでも列オプションの [再コード化] で正規表現を使用できます。私は、図 7 に示す条件文を使用しました。
このすべてのクリーンアップの後、セルの内容が 2 行に垂直に分割されている場所を特定しました。行 39/40、41/42、および 43/44 です。分割されているセルは、文字列の最初の部分が「-」で終わるため、これをインジケーターとして使用できます。次に、図 4 に示すような数式構造を使用して、テキスト文字列を合計します。最終的には、重複行を回避するために空のデータ セルを削除できます。
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.図 6: 分割されたテキスト文字列の検索と連結。
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.図 7: 数値列からテキスト文字列を削除します。
次のビデオでは、これらの手順をどのように使用したかを示し、この問題の解決策の 1 つを確認します。
問題3: ヘッダーまたはサブヘッダーのある行がデータに混在している
最後の例として、脂肪の脂肪酸組成をリストした PDF に戻ります。この場合、データ テーブルにヘッダー、単位、またはサブヘッダーの行が含まれており、JMP にインポートすると、データと混在していることがわかります (図 8)。
このような行を識別する方法の 1 つは、「Contains」数式を使用して、実際のデータには見つからないヘッダー/単位行の記号またはテキスト文字列を識別することです。たとえば、図 8 では、「Contains(“%”)」という数式を使用しています。この数式は、この記号がセルに存在しない場合は「0」になり、文字列内の文字の実際の位置にない場合は「0」になります (整数 > 0 になります)。簡単な条件文を使用して、フラグ列を生成できます。
この例では、考えられる数式を図 9 に示します。「1」(「%」が存在することを示す) の行を削除するには、行/行選択メニューの「select where」オプションを使用して、この条件を満たす行を選択します (図 10)。次に、選択した行を削除します。高度なログとワークフロー ビルダーは、この一連の手順をキャプチャし、繰り返し使用できるように自動化できます。「select where」メニューで直接使用できる選択条件は限られており、「Contains」も含まれるため、これを直接設定してフラグ列を省略できることに注意してください。
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.図 8: ヘッダーまたはサブヘッダーのある行はデータと混合され、JMP テーブルの行として表示されます。
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.図 9: 「%」文字が存在するかどうかを識別するフラグ列を作成するための「Contains」式を使用した条件ステートメント。
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.図 10: フラグ列を使用して条件付き行選択基準を追加する。
このビデオでは、データ テーブル内の不要な行 (この場合はサブヘッダー行) を識別して削除するために使用されるクリーンアップ手順を確認できます。
ボーナスビデオ: WorkflowBuilder ループを使用したインポート例
このビデオでは、最初のページで実行されたすべてのクリーンアップ手順を、数回クリックするだけで 2 ページ目にも適用できる様子をご覧ください。上記の説明で示した fat.pdf の例には、ワークフロー ビルダーの「For Each でグループ化」ループを使用しています。次に、幅の広い表形式のページが 13 ページある、より極端なケースを示します。各ページは個別にインポートしてクリーンアップする必要があります。ただし、PDF インポート ウィザードを使用して各ページから表をインポートすると、1 つの表のクリーンアップ手順を簡単に記録できます。その後、ワークフロー ビルダーの「For Each でグループ化」オプションを使用して、他の 12 の表のクリーンアップ手順を自動的に実行できます。これは効率的だと思いませんか。
最後に、これらの問題のいくつかに対処するには、私がまだ知らない、より短くてすっきりした方法があることを 100% 確信しています。以下のコメントで、他の解決策を自由に共有してください。