JSL - 누락된 데이터의 % 찾기3개의 열이 있는 데이터 테이블이 있습니다.

ID 및 SUB_ID별로 그룹화된 HEIGHT 열에 누락된 데이터의 %를 표시하는 테이블을 만들어야 합니다. 위의 경우 결과는 다음과 같아야 합니다.

그러나 데이터가 누락된 행이 없는 경우도 있습니다. 이 경우 누락 비율은 0이어야 합니다.

이를 위해 JSL 스크립트를 작성하는 데 도움이 필요합니다. 어떤 지침이라도 감사하겠습니다. 아래 스크립트에는 세 가지 문제가 있습니다.
1. 언제든지 불러올 수 있도록 데이터 테이블에 대한 핸들/참조를 추적하려면 어떻게 해야 합니까? 나는 항상 스크립트 시작 부분에 "dt = CurrentDataTable"을 사용했습니다. 그러나 요약 테이블/하위 집합 테이블을 거의 생성하지 않은 후에는 원본 테이블에 대한 참조가 손실되고 이를 최신 테이블로 만드는 방법을 모릅니다.
2. 누락된 행이 없는 경우에도 이 작업이 필요합니다. 지금은 스크립트가 중간에 멈춥니다.
3. 백분율 누락이 있는 최종 테이블을 제외하고 모든 테이블을 닫아야 합니다.
// Read the original table
dt = CurrentDataTable();
main_table = Data Table( dt ) << get name; // get the table name
// Create a summary table with no of rows grouped by ID and SUB_ID
dt_summary = dt<< Summary(Group(:ID, :SUB_ID), Freq("None"), Weight("None"), output table name( "Main Table Summary"));
:N Rows << Set Name( "Total No of Rows" );
// Create a subset of the original table with only the missing rows
Current Data Table(Data Table(main_table));
dt = CurrentDataTable();
dt_missing = dt << select where( Is Missing( :HEIGHT ) == 1 ) << Subset(Output Table Name("Missing Rows"));
If( !Is Empty( dt_missing ),
dt_missing_summary = Data Table( dt_missing ) << Summary(
Group( :ID, :SUB_ID ),Freq("None"), Weight("None"), output table name( "Missing Rows Table Summary"));
:N Rows << Set Name( "No of Rows with Missing Data" );
dt_missing_summary << Update(
With( Data Table( dt_summary ) ),
Match Columns( :ID = ID, :SUB_ID = :SUB_ID ),
Add Columns from Update table( :Total No of Rows )
);
New Column( "PercentMissing",
Numeric,
"Continuous",
Format( "Percent", 12, 2 ),
Formula( :No of Rows with Missing Data / :Total No of Rows )
);
);
//Close( dt_missing, nosave );
//Close( dt_summary, nosave );감사해요
데이터 혼합 및 정리Re: JSL - 누락된 데이터의 % 찾기응답해 주셔서 감사합니다. N Missing을 사용하여 누락된 데이터 행을 찾을 수 있다는 사실은 지금까지 몰랐습니다. 작업이 훨씬 쉬워지고 스크립트의 몇 가지 단계가 줄어들었습니다.Re: JSL - 누락된 데이터의 % 찾기단계별 설명 감사드립니다. 1, 2, 4단계는 제가 배운 새로운 요령이며 매우 도움이 됩니다. 누락된 데이터가 없는데 스크립트가 실패하는 이유는 당연합니다. 여러 조건을 적용할 때 명세서를 분할하는 것을 기억하겠습니다.Re: JSL - 누락된 데이터의 % 찾기간단하고 컴팩트한 솔루션을 제공해 주셔서 감사합니다. 원래 테이블에 추가 열을 추가하지만 이는 나에게 문제가 되지 않습니다.Re: JSL - 누락된 데이터의 % 찾기이전에 이 내용을 보셨다면 다시 읽어보시기 바랍니다. 실수가 있었습니다.
JMP에 내장된 기능인 Col N Missing( )을 사용하면 이 작업이 단순화됩니다. 2가지 접근법을 보여드리겠습니다.
해결책 #1:
- 첫 번째 테이블에 그룹별로 누락된 항목을 계산하는 열을 만듭니다.
- 첫 번째 표를 요약해 보세요.
- 원하는 경우 N 행 열의 이름을 변경하고 비율에 대한 수식 열을 만듭니다.
Names Default To Here( 1 );
//these 2 lines just create a table with overall missing rate of 35% for the weight varable.
dt = Open( "$Sample_Data\Car Physical Data.jmp" );
dt:weight[Loc( J( 116, 1, Random Binomial( 1, .35 ) ) == 0 )] = .;
//add a formula column to compute n missing rows.
dt << New Column( "Missing Rows", formula( Col N Missing( :weight, :country, :type ) ) );
//create summary table, rename N Rows column, and add a % missing formula column.
dtSum = dt << Summary( Group( :Country, :Type, :missing rows));
dtSum:N Rows << set name("Total Rows");
dtSum << new column ("Pct Missing", formula(:missing rows / :total rows));
해결책 #2:
- 첫 번째 표에 모든 수식 열을 만든 다음 간단한 요약을 작성합니다.
- 필요에 따라 요약 테이블에서 N 행 열을 삭제합니다.
** 이 방법의 "문제"는 총 행 수( ) 함수에 있습니다. 첫 번째 인수는 그룹화 열로 사용할 수 없으므로 더미 열 역할을 하려면 첫 번째 인수에 대해 "1"을 사용해야 합니다. 1을 생략하면 개수에 국가와 유형의 조합이 아닌 "유형" 그룹의 행 수만 반영되는 것을 볼 수 있습니다.
처음으로 오류에 대해 건배하고 사과드립니다.
Names Default To Here( 1 );
//don't worry about these; these are just to get a table present with some missing values @ an
//overall missing rate of 35%
dt = Open( "$Sample_Data\Car Physical Data.jmp" );
dt:weight[Loc( J( 116, 1, Random Binomial( 1, .35 ) ) == 0 )] = .;
//create formula columns using built-in functions to get what you're after.
dt << New Column( "Missing Rows", formula( Col N Missing( :weight, :country, :type ) ) );
dt << New Column( "Total Rows", formula( Col Number( 1, :country, :type ) ) );
dt << New Column( "Group Pct Missing", formula( :missing rows / :total rows ) );
//view summary table.
dtSum = dt << Summary( Group( :Country, :Type, :missing rows, :total rows, :group pct missing));
Re: JSL - 누락된 데이터의 % 찾기- 당신은 추가해야합니다
Names Default To Here( 1 );
스크립트에 지정된 변수가 동일한 이름을 가진 다른 스크립트의 변수에 의해 변경되지 않도록 제한하려면 현재 스크립트의 값을 변경하세요.
- Current Data Table() 함수에 대해 오해가 있는 것 같습니다.이는 두 가지 방법으로 사용될 수 있으며 원본 데이터 테이블에 대한 참조를 잃지 않는 데 도움이 됩니다.사양
dt = Current Data Table();
당신은 올바르게 사용하고 있습니다.그리고 나중에 스크립트에서 원본 데이터 테이블을 "현재 데이터 테이블"로 만들고 싶을 때 해야 할 일은 다음과 같습니다.current data table(dt);
이는 JMP에게 현재 데이터 테이블로 "dt"를 사용하도록 지시합니다.자제해야 할 일은 "dt"를 "=" 왼쪽에 배치하여 다시 할당하는 것입니다.
- 때로는 단일 명령문에 작업을 결합하는 것이 좋지 않은 경우도 있습니다.당신의
dt_missing = dt << select where( Is Missing( :HEIGHT ) == 1 ) << Subset(Output Table Name("Missing Rows"));하나의 명령문에서 행을 선택하고 테이블의 부분 집합을 모두 지정하려고 합니다.문제는 :Height에 누락된 값이 없으면 원하는 것을 제공하지 못한다는 것입니다.귀하의 스크립트(아래)에 대한 재작업에서 dt 데이터 테이블에는 행이 선택되었는지 여부가 포함되어 있으며, 누락된 행이 발견되었는지 확인하기 위해 검사가 수행되고, 발견된 경우에만 처리를 계속합니다.dt << select where( Is Missing( :HEIGHT ) == 1 );
If( N Rows( dt << get selected rows ) > 0,
- Try() 함수는 실패할 수 있는 함수를 실행하는 데 매우 편리하며, 실패하더라도 스크립트 실행이 중지되는 것을 원하지 않습니다.사용 중인 Close() 함수 및 Try() 함수 사용에 유용한 함수
Try( Close( dt_missing, nosave ) );
Try( Close( dt_summary, nosave ) );
도움이 되었기를 바랍니다....더 궁금한 점이 있으면 답장해 주세요.
Names Default To Here( 1 );
// Read the original table
dt = Current Data Table();
//main_table = Data Table( dt ) << get name; // get the table name
// Create a summary table with no of rows grouped by ID and SUB_ID
dt_summary = dt << Summary(
Group( :ID, :SUB_ID ),
Freq( "None" ),
Weight( "None" ),
output table name( "Main Table Summary" )
);
:N Rows << Set Name( "Total No of Rows" );
// Create a subset of the original table with only the missing rows
//Current Data Table(Data Table(main_table));
//dt = CurrentDataTable();
dt << select where( Is Missing( :HEIGHT ) == 1 );
If( N Rows( dt << get selected rows ) > 0,
dt_missing = dt << Subset( Output Table Name( "Missing Rows" ), selected rows( 1 ) );
dt_missing_summary = Data Table( dt_missing ) <<
Summary(
Group( :ID, :SUB_ID ),
Freq( "None" ),
Weight( "None" ),
output table name( "Missing Rows Table Summary" )
);
:N Rows << Set Name( "No of Rows with Missing Data" );
dt_missing_summary << Update(
With( Data Table( dt_summary ) ),
Match Columns( :ID = ID, :SUB_ID = :SUB_ID ),
Add Columns from Update table( :Total No of Rows )
);
New Column( "PercentMissing",
Numeric,
"Continuous",
Format( "Percent", 12, 2 ),
Formula( :No of Rows with Missing Data / :Total No of Rows )
);
);
Try( Close( dt_missing, nosave ) );
Try( Close( dt_summary, nosave ) );
Re: JSL - 누락된 데이터의 % 찾기@jthi ,
우리는 동시에 같은 노선을 따라 생각하고 있었는데, 귀하의 답변이 내 답변보다 조금 더 완전하고 항목 1과 3 제안에 동의한다는 점이 마음에 듭니다.
Re: JSL - 누락된 데이터의 % 찾기먼저 JMP 스크립팅 가이드를 확인해 보시기 바랍니다. JMP15 스크립팅 가이드 및 스크립팅 인덱스는 Jmp / Help / Scripting Index에서 찾을 수 있습니다. 이는 JSL 스크립팅을 위한 매우 좋은 소스입니다.
이 작업을 수행하려면 jsl이 필요하지 않습니다.
1. 두 개의 누락된 값을 제공한 예제 테이블부터 시작하겠습니다.
2. N Missing with Height를 통계로, SUB_ID 및 ID를 그룹으로 사용하여 테이블 요약을 생성합니다.


3. N개의 행과 N개의 누락(HEIGHT) 열을 선택하여 새 수식을 만듭니다.

4. 열 속성에서 형식을 백분율로 변경하고 필요에 따라 열 이름을 바꿉니다.
이러한 단계를 기반으로 JMP에서 제공하는 기능을 매우 쉽게 사용하여 이 수동 프로세스를 자동화된 프로세스로 변경하는 단계에 필요한 스크립트를 표시할 수도 있습니다(더 강력하게 만들려면 약간의 변경이 필요함).
질문 1과 3의 경우:
1. 데이터 테이블을 생성/열기/가져오는 방법에 따라 많이 달라집니다. 항상 동일한 이름을 갖고 있다면 이를 참조할 수 있지만 동일한 이름을 가진 여러 데이터 테이블을 생성하는 것이 너무 쉽고 JMP가 이름 뒤에 색인을 추가하기 때문에 장기적으로는 신뢰하지 않을 것입니다. 그러나 이는 Datatable(nameofdatatable)에서 참조할 수 있습니다.
3. Get Data Table List()를 사용하여 데이터 테이블 목록을 가져올 수 있습니다. 데이터 테이블을 반복하고 불필요한 테이블을 닫습니다. 하지만 내 생각에는 Close(데이터 테이블 참조, 저장 안 함)를 사용하여 가능한 한 빨리 필요하지 않은 데이터 테이블을 항상 닫아야 한다고 생각합니다.
작업을 수행하기 위한 예제 스크립트:
Names Default To Here(1);
//create example data and add reference to dt variable
dt = New Table("exampledata",
Add Rows(8),
Compress File When Saved(1),
New Column("ID",
Numeric,
"Nominal",
Format("Best", 12),
Set Values([1, 1, 1, 1, 2, 2, 2, 2])
),
New Column("SUB_ID",
Character,
"Nominal",
Set Values({"A", "A", "B", "B", "A", "A", "B", "B"})
),
New Column("HEIGHT",
Numeric,
"Continuous",
Format("Best", 12),
Set Values([10, 11, ., 9, ., 12, 8, 12])
)
);
//note Link to original data table(0)
//dt_summary is reference to the new Summary table
dt_summary = dt << Summary(
Group(:ID, :SUB_ID),
N Missing(:HEIGHT),
Freq("None"),
Weight("None"),
Link to original data table(0),
output table name("Main Table Summary")
);
//close unnecessary datatable
Close(dt, no save);
//add new column with formula
dt_summary << New Column("Percent Missing",
Numeric,
"Continuous",
Format("Percent", 12, 0),
Formula(:Name("N Missing(HEIGHT)") / :"N Rows"),
);
//rename columns
Column(dt_summary, "N Rows") << Set Name("Total No of Rows");
Column(dt_summary, "N Missing(HEIGHT)") << Set Name("No of Rows with Missing Data");
Re: JSL - 누락된 데이터의 % 찾기안녕 @rverma ,
테이블 내에서 요약을 활용할 수 있는 것으로 확인됩니다.해당 섹션에서 수행하는 작업의 대부분을 생성한 다음 비율(%)을 계산하는 수식이 포함된 열을 추가할 수 있습니다.
누락된 데이터가 없는 경우에도 계속 작동하는 다음과 같은 스크립트를 만들 수 있습니다(항목 2 추가).
sumdt = dt << Summary( Group( :ID, :SUB_ID ), N Missing( :HEIGHT ), Freq( "None" ), Weight( "None" ) );
sumdt << New Column( "Percent Missing",
Numeric,
Continuous,
Format( Percent ),
Formula( :"N Missing(HEIGHT)"n / :N Rows )
);
그러면 이것에 대해 부분집합을 설정할 수 있습니다. 그리고 여전히 다른 창을 닫으세요.
이제 시작이다