빈 데이터가 있는 셀 선택아래 표와 같은 표가 있습니다.
| 운영자 |
M타입 |
설명 |
설명 2 |
M1 |
M2 |
M3 |
M4 |
M5 |
M6 |
| 415 |
Nxyz |
뜨거운 |
핫클린 1 |
415 |
415 |
415 |
415 |
415 |
415 |
| 615 |
Nxyz |
B 감기 |
콜드클리닝 1 |
615 |
615 |
615 |
|
615 |
615 |
| 815 |
Nxyz |
뜨거운 |
핫클린 2 |
815 |
815 |
815 |
815 |
815 |
815 |
| 1015 |
Nxyz |
B 감기 |
콜드클리닝 2 |
1015 |
|
1015 |
1015 |
1015 |
1015 |
| 1215 |
Nxyz |
뜨거운 |
핫클린 1 |
1215 |
1215 |
1215 |
1215 |
1215 |
1215 |
| 1415 |
Nxyz |
B 감기 |
콜드클리닝 1 |
1415 |
1415 |
1415 |
1415 |
1415 |
|
| 1615년 |
Nxyz |
뜨거운 |
핫클린 2 |
1615년 |
1615년 |
1615년 |
1615년 |
1615년 |
1615년 |
| 1815년 |
Nxyz |
B 감기 |
콜드클리닝 2 |
1815년 |
1815년 |
1815년 |
|
|
1815년 |
비어있는 행만 선택하고 싶습니다. M1-M6 열은 데이터를 가져올 때마다 달라질 수 있으므로 JSL 스크립트에서 열 이름을 사용할 수 없습니다. 아래의 FOR 루프를 사용하여 빈 데이터 행을 선택하려고 하는데 이는 마지막 셀이 비어 있는 행만 선택합니다.
dt = Current Data Table();
nc = dt << get column names( Numeric );
For( i = 1, i <= N Items( nc ), i++,
dt <<SELECT where=""></SELECT>
결국 출력 테이블을 다음과 같이 만들고 싶습니다.
| 운영자 |
M타입 |
설명 |
설명 2 |
기계 |
| 615 |
Nxyz |
B 감기 |
콜드클리닝 1 |
M4 |
| 1015 |
Nxyz |
B 감기 |
콜드클리닝 2 |
M2 |
| 1415 |
Nxyz |
B 감기 |
콜드클리닝 1 |
M6 |
| 1815년 |
Nxyz |
B 감기 |
콜드클리닝 2 |
M4 |
| 1815년 |
Nxyz |
B 감기 |
콜드클리닝 2 |
M5 |
이에 대한 가장 큰 트릭은 (M1,M2 등...) 열 이름이 변경될 때 이를 코딩하지 않고 수행하는 것입니다.
어떤 아이디어라도
자동화 및 스크립팅Re: 빈 데이터가 있는 셀을 선택하는 중입니다.<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />모두 감사합니다.....Loc Nonmissing을 제외한 모든 것이 작동했습니다.....지금은 JMP9만 있고(업그레이드하기 너무 게으름) JMP9에서는 해당 기능이 작동하지 않습니다......아직도요. JSL 초보자.....다시 한번 감사드립니다
Re: 빈 데이터가 있는 셀을 선택하는 중입니다.훨씬 더 매끄러운 MS - 이제 0줄의 코드로 이를 수행하는 것을 보도록 하겠습니다!하하 JSL에서 동일한 작업을 수행하는 여러 가지 방법이 있음을 보여 드리겠습니다.
Re: 빈 데이터가 있는 셀을 선택하는 중입니다.귀하의 메시지를 올바르게 읽고 있다면 실제로 두 가지 질문이 있는 것 같습니다.
- 특정 열 집합에서 모두 누락된 행을 찾는 방법입니다.
- 해당 열의 이름과 열 수에 의존하지 않도록 코드를 만드는 방법.
당연히 1을 수행하는 방법에는 여러 가지가 있습니다. PM로즈 , MS 그리고 크레이지@JMP 거기에서 몇 가지 옵션을 제공했습니다.
하나 더 던져보겠습니다. 당신은 누락된 데이터 패턴 유틸리티를 사용하여 찾을 수 있습니다.
dt = Open( "$SAMPLE_DATA\Cities.jmp" );
//delete some columns from this table to make it fit your example
dt << delete columns( "PM10", "X", "Y" );
//change name of data table to ensure this modified version doesn't get saved
//over the sample data
dt << set name( "CitiesModified" );
//I want to use the columns starting at column 9,
//so I build a list of references to them
mycols = {};
For( i = 9, i <= N Cols( dt ), i++,
Insert Into( mycols, Column( dt, i ) )
);
mdp = Dt << Missing Data Pattern( columns( Eval( mycols ) ), Output Table( "Missing Data Pattern" ) );
//The patterns columns shows the pattern of missing values
//the Missing Data Pattern data table is sorted,
//so if there are rows with all missing data
//the last row of the Missing Data Pattern data table will be all 1s.
//The Repeat() function just builds a string of 1s for as many columns as I'm working with
If( Column( mdp, "Patterns" )[N Rows( mdp )] == Repeat( "1", N Items( mycols ) ),
//The Missing Data Pattern data table is linked to the source table so selecting a row
//in it, selects all the rows that it represents in the source table
mdp << Select Rows( N Rows( mdp ) );
//now I can delete the rows in the source table
dt << delete rows;
,
Show( "No all missing rows" )
);
나는 이 코드를 여러 열에 대해 작동시키는 방법을 보여주려고 노력했습니다. 이 경우 누락된 데이터 패턴 유틸리티에 전달할 열 목록이 필요했기 때문에 열 번호를 기반으로 목록을 작성했습니다.
이 모든 내용을 작성하고 누락 데이터 패턴 유틸리티를 사용하는 방법을 보여 주었음에도 불구하고 여기서 제가 가장 좋아하는 솔루션은 다음과 같습니다. PM로즈 사용하는 것입니다 기둥 쌓기 . 결국 데이터가 쌓이게 되기를 원하므로 먼저 그렇게 하면 쌓인 열에서 누락된 행을 선택하고 삭제하기가 쉬워집니다.
dt = Open( "$SAMPLE_DATA\Cities.jmp" );
//delete some columns from this table to make it fit your example
dt << delete columns( "PM10", "X", "Y" );
//change name of data table to ensure this modified version doesn't get saved
//over the sample data
dt << set name( "CitiesModified" );
//again I need a list of columns to use in the Stack()
mycols = {};
For( i = 9, i <= N Cols( dt ), i++,
Insert Into( mycols, Column( dt, i ) )
);
//stack those columns creating a new data table
stacked_dt = dt << Stack(
columns( Eval( mycols ) ),
Source Label Column( "Gas" ),
Stacked Data Column( "PPM" )
);
missing_rows = stacked_dt << get rows where( Is Missing( :PPM ) );
stacked_dt << delete rows( missing_rows );
Re: 빈 데이터가 있는 셀을 선택하는 중입니다.빈 셀이 있는 행을 선택하는 또 다른 방법은 다음과 같습니다.
dt << select where(!Contains(Loc Nonmissing(dt << get as matrix), Row()));
Re: 빈 데이터가 있는 셀을 선택하는 중입니다.매우 매끄 럽습니다.표현식(e)에 삽입할 수 있는지 몰랐습니다.나는 생각했다 에 집어 넣다 목록이 필요했습니다.
Re: 빈 데이터가 있는 셀을 선택하는 중입니다.같은 대답 PM로즈 표현식 조작 사용:
dt = Current Data Table();
e = Expr( Or() ); // the OR of the ismissing(columns) will be built here
nc = dt << get column names( Numeric );
For( i = 1, i <= N Items( nc ), i++,
Insert Into( e, Eval Expr( Is Missing( Expr( nc ) ) ) )
);
dt << selectwhere( e );
"e"라는 표현은 다음과 같습니다
nameexpr(e)
/*:
Is Missing( :m1 ) | Is Missing( :m2 ) | Is Missing( :m3 ) | Is Missing( :m4 ) | Is Missing( :m5 ) | Is Missing( :m6 )
헤드 인수 재귀 공식
내성

Re: 빈 데이터가 있는 셀을 선택하는 중입니다.STACK 명령을 사용하여 M1-Mn 값을 포함하여 데이터를 쌓을 수 있습니다.그런 다음 비어 있는 행을 선택하고 삭제합니다.
또는 다음 코드를 사용해 보세요.
dt = Current Data Table();
col_list = dt << get column names( Numeric, string );
where_clause = "";
For( i = 1, i <= N Items( nc ), i++,
one_col = col_list[i];
if (i == 1,
// then
where_clause =evalinsert("\[dt << select where(is missing(as column(dt, "^one_col^"))]\");
// else
,
where_clause = evalinsert("\[^where_clause^ | is missing(as column(dt, "^one_col^"))]\");
);
);
where_clause = where_clause || ")";
eval(parse(where_clause));