목록의 모든 열에 대해 비어 있는 행 삭제해결됨: Re: JSL을 사용하여 하나 이상의 빈 값이 있는 행 제거 - 페이지 2 - JMP 사용자 커뮤니티
위에서 논의한 내용을 바탕으로 빈 행을 삭제하는 스크립트가 있는데, 나열된 열 중 어느 하나에서 비어 있는 행만 삭제하는 것으로 보입니다. 반면 저는 나열된 열에서 모든 열이 비어 있는 행을 삭제하고 싶습니다.
감사해요
// Get the current data table
dt = Current Data Table();
// Get all column names as strings
cnmes = dt << Get Column Names("string");
// Initialize Start and End indices
Start = .;
End = .;
// Find the index of the "Start" column
For(i = 1, i <= N Items(cnmes), i++,
If(Contains(cnmes[i], "Start"),
Start = i + 1;
Break(); // Exit loop once found
);
);
// Find the index of the "End" column
For(j = 1, j <= N Items(cnmes), j++,
If(Contains(cnmes[j], "End"),
End = j-1;
Break(); // Exit loop once found
);
);
datacols = {};
For(k = start, k <= End, k++,
Insert into (datacols, cnmes[k]) // Determine Data Columns
);
keeprows = Loc Nonmissing( datacols );
dt << select rows( keeprows ) << invert Row Selection << delete rows;
자동화 및 스크립팅Re: 목록의 모든 열에 대해 비어 있는 행 삭제JSL을 충분히 공부해서 필요한 작업을 수행하지 못하는 이유를 이해하셨나요?
Select Where에 대한 스크립팅 가이드를 살펴보세요.
datacols의 첫 번째 열에 대해 누락된 값이 있는 모든 행을 찾은 다음, 해당 행 목록에서 두 번째 열에 대해 누락된 값이 있는 행을 선택하고, 세 번째 열에 대해서도 마찬가지 방법으로 datacols 목록의 마지막 열에 도달할 때까지 반복합니다.
그 뒤에 남는 행은 datacols의 모든 열에 대해 값이 누락된 행만 포함합니다.
그러면 남은 행을 삭제하기만 하면 됩니다.
Select Where() 함수의 Current Selection() 요소를 살펴보세요. 이 요소는 선택 항목을 적용할 때 이후의 Select Where 함수가 이전에 선택된 행만 보도록 제한합니다.
Re: 목록의 모든 열에 대해 비어 있는 행 삭제짐
이해는 갑니다. 실패할 운명이었으니까요. 하지만 당신의 아이디어는 훌륭하네요! 이렇게 생겼네요.
dt = Current Data Table();
// Get all column names as strings
cnmes = dt << Get Column Names("string");
// Initialize Start and End indices
Start = .;
End = .;
// Find the index of the "Start" column
For(i = 1, i <= N Items(cnmes), i++,
If(Contains(cnmes[i], "Start"),
Start = i + 1;
Break(); // Exit loop once found
);
);
// Find the index of the "End" column
For(j = 1, j <= N Items(cnmes), j++,
If(Contains(cnmes[j], "End"),
End = j-1;
Break(); // Exit loop once found
);
);
For(l = Start, l <= End, l++,
full_rows = dt << get rows where( !Is Missing( As Column(cnmes[l]) ) );
For Each Row(If(is missing(cnmes[i]), Remove From(full_rows))));
dt << Select Rows(full_rows) << Invert Row Selection << Delete Rows;Re: 목록의 모든 열에 대해 비어 있는 행 삭제이게 효과가 있나요? 어떻게 될지 모르겠네요. 각 열을 서로 독립적으로 처리하고 있습니다. 각 열의 full_rows를 재설정하고 있는 거죠.
다음은 여러 행을 선택하려면 where()_를 사용하여 선택하려는 행을 좁히는 예입니다.
names default to here(1);
dt =
// Open Data Table: Big Class.jmp
// → Data Table( "Big Class" )
Open( "$SAMPLE_DATA/Big Class.jmp" );
// Select all males
dt << select where( :Sex == "M");
// From all of the selected males, select all of the 12 year olds
dt << select where( :age == 12, Current Selection("Restrict"));Re: 목록의 모든 열에 대해 비어 있는 행 삭제스크립트의 첫 번째 부분에서 무슨 일이 일어나고 있는지 또는 이 질문(열 목록을 만드는 것?)과 어떻게 관련이 있는지 정확히 모르겠지만, JMP 플랫폼(누락된 데이터 패턴)을 사용하거나(Jim이 제안한 것처럼) 위치를 선택하거나, 예를 들어 데이터 테이블 구독 + 루프/데이터 테이블 구독 + 일부 행렬 연산을 사용할 수 있습니다.
먼저 JMP에서 제공하는 Missing Data 플랫폼을 사용해 보세요. 이 플랫폼이 사용 가능한지 확인해 보세요(사용 가능합니다). 그런 다음 Jim이 제안한 Select Where 옵션을 살펴보세요. 스크립트를 작성하고 Jim의 제안이 어떻게 작동하는지 이해한 후에, 여전히 원하신다면 제가 아래에 제안하는 데이터 테이블 구독 옵션을 살펴보실 수 있습니다.
누락된 데이터 패턴
JMP 사용 > 데이터 입력 및 편집 > 데이터 테이블의 데이터 구성 > 데이터 테이블에서 누락된 데이터 패턴 보기
스크립팅 가이드 > 데이터 테이블 > 고급 데이터 테이블 스크립팅 > 누락된 데이터 패턴 찾기


이것은 행렬 연산을 사용하며 작동해야 한다고 생각합니다.
Names Default To Here(1);
dt = New Table("Untitled",
Add Rows(11),
Compress File When Saved(1),
New Column("Column 1", Character, "Nominal", Set Values({"", "", "aa", "", "a", "a", "", "a", "", "a", ""})),
New Column("Column 2", Character, "Nominal", Set Values({"", "a", "a", "a", "a", "", "", "a", "a", "", ""})),
New Column("Column 3", Character, "Nominal", Set Values({"a", "", "a", "", "a", "", "a", "", "", "", "a"}))
);
cols_to_check = {"Column 2", "Column 3"};
m = Matrix(IsMissing(dt[0, cols_to_check]));
rows_to_delete = Loc(V Sum(m`) == 2);
dt << select rows(rows_to_delete); // for demo purposes
dt << Delete Rows(rows_to_delete); // use this in real use case
이렇게 하면 누락된 값을 확인하는 동안 행을 반복합니다.
rows_to_delete = {};
For Each Row(dt,
m = Loc Nonmissing(dt[Row(), cols_to_check]);
If(N Items(m) == 0,
Insert Into(rows_to_delete, Row());
);
);
dt << Select Rows(rows_to_delete);
Re: 목록의 모든 열에 대해 비어 있는 행 삭제(목록)이 누락되었고 (행렬)이 누락되었습니다.
좋아요! - 그리고 예상치 못했어요.


어떤 JSL 함수가 "벡터화"될 수 있는지에 대한 일반적인 개요가 있나요?
Re: 목록의 모든 열에 대해 비어 있는 행 삭제스크립트는 잘 작동한다고 생각했는데, 지적하신 대로 결함이 있습니다. @Jarmo 님의 아이디어를 시도해 봤는데 작동은 하는데, 매트릭스가 채워지지 않습니다.
// Get the current data table
dt = Current Data Table();
// Get all column names as strings
cnmes = dt << Get Column Names("string");
// Initialize Start and End indices
Start = .;
End = .;
// Find the index of the "Device 2" column
For(i = 1, i <= N Items(cnmes), i++,
If(Contains(cnmes[i], "Device 2"),
Start = i + 1;
Break(); // Exit loop once found
);
);
// Find the index of the "Process Script" column
For(j = 1, j <= N Items(cnmes), j++,
If(Contains(cnmes[j], "start_date"),
End = j-1;
Break(); // Exit loop once found
);
);
datacols = {};
For(k = start, k <= End, k++,
Insert into (datacols, cnmes[k]) // Determine Data Columns
);
m = Matrix(IsMissing(dt[0, datacols]));
rows_to_delete = Loc(V Sum(m`) == 2);
dt << select rows(rows_to_delete); // for demo purposes
dt << Delete Rows(rows_to_delete); // use this in real use case
Re: 목록의 모든 열에 대해 비어 있는 행 삭제데이터 열에 원하는 내용이 포함되어 있나요? 또한, 두 열을 데이터에 맞게 조정해야 합니다. 예를 들어,
rows_to_delete = Loc(V Sum(m`) == N Items(cols_to_check));
좋은 생각일 수도 있겠다
Re: 목록의 모든 열에 대해 비어 있는 행 삭제자르모
그게 해결됐어요. 사실 2의 의미가 궁금했어요.
감사해요