소개
R&D에서 사용하는 대부분의 데이터는 데이터베이스, Excel 또는 CSV 파일에서 나오거나 JMP에 직접 입력됩니다. 하지만 지원 데이터는 종종 다른 형식, 특히 PDF 파일로 제공됩니다. 예를 들어, 화학 참조 표, 공급업체 정보 시트 또는 이제는 PDF로만 존재하는 과거 회사 데이터를 생각해 보세요. 이러한 유형의 지원 정보는 실험 데이터를 보완하는 데 매우 유용할 수 있으며, 다행히도 JMP에는 이러한 유형의 데이터를 가져올 수 있는 PDF 가져오기 마법사가 있습니다. 이러한 표는 JMP와 같은 통계 소프트웨어에 맞게 포맷되지 않았기 때문에 PDF에서 데이터를 가져오면 추가 정리 단계가 필요한 지저분한 데이터 표가 생성되는 경우가 많습니다.
R&D 시절에 저는 JMP의 PDF 임포트 마법사를 알고 있었고 가끔 사용했습니다. 연구 프로젝트를 보완하기 위해 PDF 데이터를 찾았지만 JMP로 데이터를 임포트한 후 테이블을 정리하는 방법을 알아낼 수 없는 경우도 있었습니다. 그런 경우 프로젝트를 포기하고 추가 정보를 포기해야 했는데, 매우 실망스러웠습니다.
몇 년이 빨리 지나고, 지금은 가져온 후 데이터가 아무리 지저분하더라도 모든 PDF 파일을 처리할 수 있는 도구가 있다고 느낍니다. 많은 지저분한 데이터 문제와 마찬가지로 열 수식은 가져온 PDF 데이터를 정리하는 방법입니다. 이는 Workflow Builder에서 단계를 기록하거나 프로세스를 자동화하기 위해 스크립트를 캡처하려는 경우에 특히 그렇습니다.
누가 이 블로그를 읽어야 할까요?
다음과 같은 경우 계속 읽어보세요.
- PDF 가져오기 마법사의 기본 사항에 대해 자세히 알고 싶으신가요?
- PDF 데이터를 가져온 후 데이터 정리에 문제가 발생합니까?
- 플래그 열과 열 서브스크립트를 사용하여 데이터를 정리하는 방법에 대해 자세히 알아보고 싶습니까?
- 여러 페이지에 걸쳐 DPF 정리 단계를 반복하는 방법을 알고 싶습니까?
모든 내용을 다 읽을 필요는 없습니다. 아래에서 관심 있는 섹션으로 바로 이동하실 수 있습니다.
개요
PDF에서 가져온 데이터를 정리할 때 두 가지 구성으로 돌아가는 것을 발견했는데, 저는 이 두 가지를 단독으로 또는 조합해서 사용합니다. 그것들은 다음과 같습니다.
- 플래그 열: 특정 기준을 충족하는 행을 식별하기 위한 이진 플래그를 만듭니다. "누락 vs. 누락되지 않음", "0" vs. "0이 아님" 등이 될 수 있습니다. 플래그 열은 조건에 따라 행을 선택하는 것과 함께 사용할 수도 있습니다.
- 행 서브스크립트: 한 셀을 다음 셀(또는 이전 셀)과 비교하고 이를 사용하여 플래그 지정 열을 생성하거나 연속 셀에서 셀 값을 연결합니다. Row(), Row() +1, Row()-1을 열 서브스크립트(서브스크립트 괄호 “[ ]” 사이에 사용)로 사용합니다.
제가 자주 사용하는 유용한 공식도 몇 가지 있습니다.
도움이 되는 공식:
- 누락()
- 포함()
- 만약에 ()
- 길이()
- 연결(“||”)
이 블로그 게시물에서는 PDF 데이터를 가져오는 데 일반적으로 관련된 다음 유형의 문제를 살펴보겠습니다.
각 주제별로 짧은 토론과 영상이 제공됩니다.
이러한 문제와 정리 방법을 살펴보기 전에 JMP에서는 거의 항상 동일한 최종 결과를 얻는 여러 가지 방법이 있다는 점을 기억하세요. 그러나 저는 정리 단계를 워크플로로 반복할 수 있도록 Workflow Builder에 기록된 솔루션을 선택하겠습니다. 일반적으로 이는 "더 빠른" 마우스 오른쪽 클릭 옵션(사용 가능한 경우) 대신 수식 열을 사용하거나 추가 기능 옵션을 사용한다는 것을 의미합니다. 각 단계가 기록되는 방식으로 정리 단계를 설정하면 정확히 동일한 정리 단계가 필요한 다른 데이터 테이블에서 워크플로를 사용할 수 있습니다. 예를 들어, 13페이지에 걸친 PDF 테이블의 마지막 예를 살펴보세요. 이 PDF를 JMP로 가져오면 13개의 테이블이 생성됩니다. 마지막 비디오에서 볼 수 있듯이 수식 열이 있는 첫 번째 테이블에 대한 정리 단계를 기록한 다음 JMP에서 정리 단계를 반복하여 13개 테이블 모두에 적용했습니다(JMP 18의 Workflow Builder에서 For Each 함수를 사용하여 그룹화 ). 이렇게 하면 13개 테이블을 쉽게 정리할 수 있습니다! 여기에서 Workflow Builder Looping 예제가 있는 비디오를 보세요.
간단한 예로 시작해 보겠습니다. 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의 열 3)을 선택한 다음, 셀을 마우스 오른쪽 버튼으로 클릭하고 채우기를 선택한 다음 누락된 값을 이전 값으로 바꾸기를 선택하는 것입니다.JMP 18까지의 모든 버전의 JMP에서 이 마우스 오른쪽 버튼 클릭 동작은 아직 Workflow Builder나 고급 로그에 기록되지 않았습니다.JMP 19에서는 추가될 예정이지만, 이전 버전의 경우 Workflow Builder나 고급 로그에 기록된 이전 값으로 누락된 셀 값을 대체하기 위한 보다 강력한 옵션은 열 수식을 사용하는 것입니다.저는 수식 자체에서 열 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에서 정리되어야 하는 또 다른 예로는 하위 머리글과 같은 값이 한 열의 여러 행으로 분할되는 경우입니다(그림 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로 가져올 때 여러 행으로 분할됩니다(오른쪽).
이를 정리하려면 문자열의 일부를 식별한 다음 함께 연결해야 합니다. 전체 문자열을 적절한 행에 대해 반복한 다음 나머지 부분 문자열을 삭제해야 합니다. 이 문제를 해결하는 한 가지 방법은 누락과 누락되지 않음을 식별하거나 "다음 행 누락"과 "다음 행 누락되지 않음"을 식별하는 플래그 열을 만드는 것입니다. 그림 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: 두 행에 걸쳐 분할된 하위 머리글을 찾고 수정하기 위한 일련의 열 수식.
여기에서 제가 이 단계를 시연하는 것을 볼 수 있습니다.
문제 2b: 셀 값이 여러 열에 걸쳐 분할됨
다음 예에서는 여기에서 찾은 다른 PDF 파일을 사용합니다. 이 경우 셀 값은 두 행과 두 열에 걸쳐 나뉩니다. 그림 5의 왼쪽 이미지를 살펴보세요. 이 예에서 화학 이름 "Oxy-1,4-phenylenesulfonyl-1,4-phenyleneoxy-1,4-phenelyneisopropylidene-1,4-phenylene"(파란색 상자로 표시)은 두 행뿐만 아니라 두 열에도 걸쳐 나뉩니다. 이는 표의 위쪽에 유리 전이 Tg에 대한 두 값이 하나가 아닌 두 개 나열되어 열 구분선이 화학 이름이나 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 열에 반복 단위 열에 속하는 잘린 텍스트가 있는 셀이 두 개 있습니다. 이 경우 다른 셀에 있는 숫자 대신 잘린 텍스트가 문자라는 사실을 사용할 수 있습니다. 따라서 이 문제를 수정하는 한 가지 방법은 그림 6에 표시된 대로 다음 단계를 따르는 것입니다.
- 첫 번째 문자로 열을 만듭니다(1단계).
- Recode 플랫폼의 문자열 바꾸기 옵션을 사용하여 숫자인 모든 것을 아무것도 아닌 것으로 바꾸세요. 이를 위해 정규 표현식 [0-9-]를 사용하여 "-"를 포함한 모든 숫자를 찾았습니다. (2단계).
- "Ismissing" 공식을 사용하여 텍스트 문자열을 찾아 원래(잘라낸) 문자열과 연결합니다(3단계).
- 조건문과 Text Flag 열을 사용하여 Tg 열을 정리합니다. 이 방법은 약간 어색하지만, 제 역할을 합니다. 정규 표현식을 알고 있다면 Recode 열 옵션에서 여기에서도 사용할 수 있습니다. 저는 그림 7에 표시된 조건문을 사용했습니다.
이 모든 정리를 마친 후, 셀 내용이 두 행에 걸쳐 수직으로 분할되는 위치를 파악했습니다. 행 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: 숫자 열에서 텍스트 문자열 제거.
다음 영상에서는 이러한 단계를 어떻게 사용했는지 보여드리므로 이 문제에 대한 하나의 가능한 해결책을 보실 수 있습니다.
문제 3: 헤더 또는 하위 헤더가 있는 행이 데이터와 섞여 있습니다.
마지막 예에서 지방의 지방산 구성을 나열한 PDF로 돌아갑니다. 이 경우 데이터 테이블에 헤더, 단위 또는 하위 헤더가 있는 행이 포함되어 있으며, JMP로 가져오면 이제 데이터와 혼합됩니다(그림 8).
이러한 행을 식별하는 한 가지 방법은 "Contains" 수식을 사용하여 실제 데이터에서 찾을 수 없는 헤더/단위 행의 기호나 텍스트 문자열을 식별하는 것입니다. 예를 들어, 그림 8에서 "Contains("%") 수식을 사용합니다. 이 수식은 이 기호가 셀에 없거나 문자열의 문자 실제 위치에 없으면 "0"을 반환합니다(정수 > 0). 간단한 조건문을 사용하면 플래그 열을 생성할 수 있습니다.
이 예에서 가능한 공식은 그림 9에 나와 있습니다. "1"(%가 있음을 나타냄)이 있는 행을 제거하려면 행/행 선택 메뉴(그림 10)에서 "선택 위치" 옵션을 사용하여 이 기준을 충족하는 행을 선택합니다. 그런 다음 선택한 행을 삭제합니다. 고급 로그 및 워크플로 빌더는 이러한 단계 시퀀스를 캡처하여 반복 사용을 위해 자동화할 수 있습니다. "선택 위치" 메뉴 아래에 "포함"을 포함하여 제한된 셋오프 선택 기준이 직접 제공되므로 이를 직접 설정하고 플래그 열을 생략할 수 있습니다.
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: "%" 문자가 있는지 여부를 식별하는 플래그 열을 생성하기 위한 "포함" 수식이 포함된 조건문.
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 루프를 사용한 가져오기 예제
이 비디오에서는 첫 번째 페이지에 수행된 모든 정리 단계를 몇 번의 클릭만으로 두 번째 페이지에 적용할 수 있는 방법을 살펴보세요. 위에서 논의한 fat.pdf 예제에 대해 Workflow Builder에서 "For Each로 그룹화" 루프를 사용합니다. 다음으로, 넓은 표 형식으로 13페이지가 있는 좀 더 극단적인 사례를 보여드리겠습니다. 각 페이지를 개별적으로 가져와서 정리해야 합니다. 그러나 PDF 가져오기 마법사를 사용하여 각 페이지에서 표를 가져온 후에는 한 표에 대한 정리 단계를 간단히 기록할 수 있습니다. 그런 다음 Workflow Builder에서 "For Each로 그룹화" 옵션을 사용하여 다른 12개에 대한 정리 단계를 자동으로 실행할 수 있습니다! 얼마나 효율적인지요!?!
마지막으로, 저는 아직 모르는 이런 문제 중 일부를 해결하는 더 짧거나 깔끔한 방법이 있다고 100% 확신합니다. 아래 댓글에 다른 해결책을 공유해 주세요.