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-누락 된 데이터의 % 찾기안녕 @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 )
);
그런 다음 이것에 대한 하위 집합을 만들 수 있습니다. 그리고 여전히 다른 창을 닫습니다.
그 시작
Re : JSL-누락 된 데이터의 % 찾기먼저 JMP 스크립팅 가이드를 확인하는 것이 좋습니다. JMP15 스크립팅 가이드 및 Jmp / Help / Scripting Index에서 찾은 Scripting Index. 이것들은 JSL 스크립팅을위한 아주 좋은 소스입니다.
이 작업을 수행하려면 jsl이 필요하지 않습니다.
1. 두 개의 결 측값을 제공 한 예제 테이블부터 시작하겠습니다.
2. 높이가 통계로, SUB_ID 및 ID가 그룹으로 N 누락 된 테이블의 요약을 만듭니다.


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

4. 열 속성에서 형식을 백분율로 변경하고 필요에 따라 열 이름을 바꿉니다.
이러한 단계를 기반으로 JMP 제공 기능을 상당히 쉽게 사용하여이 수동 프로세스를 자동화 된 프로세스로 변경하는 단계에 필요한 스크립트를 표시 할 수 있습니다 (더 강력하게하려면 약간의 변경을 수행해야합니다).
그리고 귀하의 질문 1 및 3에 대해 :
1. 데이터 테이블을 생성 / 열거 나 가져 오는 방법에 따라 다릅니다. 항상 같은 이름을 가지고 있다면 그것을 참조 할 수 있지만, 같은 이름으로 여러 데이터 테이블을 만드는 것이 너무 쉽고 JMP가 이름 뒤에 인덱싱을 추가하기 때문에 장기적으로는 믿을 수 없습니다. 그러나 이들은 Datatable (nameofdatatable)에서 참조 할 수 있습니다.
3. 데이터 테이블 목록 가져 오기 ()를 사용하여 데이터 테이블 목록을 가져올 수 있습니다. 데이터 테이블을 반복하고 불필요한 항목을 닫습니다. 그러나 제 생각에는 Close (datatable reference, No save)로 가능한 한 빨리 필요하지 않을 데이터 테이블을 항상 닫아야합니다.
작업을 수행하기위한 예제 스크립트 :
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-누락 된 데이터의 % 찾기@jthi ,
우리는 동시에 같은 줄을 따라 생각하고 있었는데, 귀하의 답변이 내 것보다 조금 더 완전하고 항목 1 및 3 제안에 동의한다는 점이 마음에 듭니다.
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 - 누락된 데이터의 % 찾기이전에 이것을 봤다면 다시 읽으십시오. 실수가 있었습니다.
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개의 행 열을 삭제합니다.
** 이 방법의 "gotcha"는 Total Rows( ) 함수에 있습니다. 첫 번째 인수는 그룹화 열로 사용할 수 없으므로 더미 열로 사용하려면 첫 번째 인수에 대해 "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));