<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />내가하고 싶은 일을 할 수있는 좋은 방법이 있는지 확실하지 않지만 다음과 같은 상황이 있습니다.
매초마다 측정 값을 수집 한 결과 인 데이터 파일이 있습니다. 타임 스탬프 열, 상태 열 및 모든 데이터 열이 있습니다.
상태 열에는 "RAMP", "WAIT"및 "READ"의 세 가지 가능한 항목이 있습니다. 시간에 따른 데이터의 일반적인 정렬은 "RAMP"의 약 20 행, "WAIT"의 85 행, "READ"의 9 행, 그리고 12 번 반복됩니다. 내가 선택한 지역의 관심 분야는 "WAIT"로 표시된 각 섹션의 마지막 30 개 행입니다.
분명히 모든 "대기"행 또는 전체 파일의 마지막 30 행을 선택하는 것은 매우 간단하지만 각 섹션의 마지막 30 개만 선택하는 방법을 알 수는 없습니다.
이 문제를 해결할 좋은 방법이 있습니까?
테이블 이름 및 목록 항목 수를 얻는 방법 :
dt = 현재 데이터 테이블 () ;
dt_name = dt << 이름을 얻다 ;
처음 = { "에이" , "비" , "기음" } ;
니 넴스 ( 처음 ) ;
사용 || 문자열을 다른 문자열과 연결하려면 :
"끈" || ( dt << 이름을 얻다 )
필자가 알고있는 또 다른 함수가 있어야하지만 찾을 수 없습니다 - 현재 데이터 테이블 ()은 dt에 할당 할 수있는 참조를 반환하지만 테이블의 이름을 추출하는 방법을 찾고 있습니다 - 스크립트가 있습니다. 여러 테이블에서 실행하고 싶습니다. 현재 테이블에서 시작한 다음 "<설명 문자열> <현재 이름의 이름>"이라는 새 하위 테이블을 만듭니다. 나는 출력 테이블 이름 ( "string"dt) 또는 ( "string"$ dt)을 기대하고 있었지만 그렇게하지는 않았다. 찾고있는 문서를 통해 사냥을하고 있지만,이 경우 주석을 거기에 던질 것이라고 생각했습니다.
내가 원했던 목록을 만드는 방법을 찾았습니다.
last_30_waits = {};
for (j = 1, j <= 3, j ++,
for (i = 0, i≤3, i ++,
insertinto (last_30_waits, (wait_end_list- i))));
dt << 행 선택 (last_30_waits);
그러나 나는 그것이 최적이 아닌 느낌을 가지고 있습니다. 또한 목록의 항목 수를 반환하는 함수가 있습니까? 그 기능을 가진 첫 번째 for 루프에서 "3"을 바꾸고 싶습니다. 그러나 문제를 찾는 데 어려움을 겪고 있습니다.
고맙습니다. 저에게 정말 가까이 다가옵니다.하지만 단서가 하나 더 있습니다. wait_start_list / wait_end_list의 각 쌍 사이에서 * 모든 것을 선택하는 가장 좋은 방법은 무엇입니까? 전에 목록으로 일한 적이 없습니다. (나는 일반적으로 스크립팅에 익숙하지 만 가능한 한 최선을 다해 배우려고 노력하고 있습니다.)
여기에 한 가지 방법이 있습니다. 모든 대기 행을 검색 한 다음 행 번호를 반복합니다. 간격이 1보다 큰 경우 섹션의 끝을 발견했습니다. 아래 코드는 각 섹션의 시작 및 끝 행 번호를 식별하는 두 개의 목록을 작성합니다. 나는이 예제를 위해 작은 테이블을 만들었다. 변화시키다 쐐기풀 ~에 매개 변수 30 귀하의 데이터.
dt = 새 테이블 ( "임시 직원" ,
행 추가 ( 39 세 ) ,
새 열 ( "지위" ,
캐릭터 ,
명사 같은 ,
값 설정 (
{ "비탈길" , "비탈길" , "비탈길" , "기다림" , "기다림" , "기다림" , "기다림" , "기다림" , "독서" ,
"독서" , "독서" , "독서" , "독서" , "비탈길" , "비탈길" , "비탈길" , "기다림" , "기다림" ,
"기다림" , "기다림" , "기다림" , "독서" , "독서" , "독서" , "독서" , "독서" , "비탈길" ,
"비탈길" , "비탈길" , "기다림" , "기다림" , "기다림" , "기다림" , "기다림" , "독서" , "독서" ,
"독서" , "독서" , "독서" }
)
) ,
) ;
wait_rows = dt << 행을 가져오다. ( : 지위 == "기다림" ) ;
nr = 안주 ( wait_rows ) ;
wait_start_list = {} ;
wait_end_list = {} ;
old_row = wait_rows [ 1 ] - 1 ;
// 얻을 WAIT 행 수
쐐기풀 = 4 ;
// 마지막 4 개의 WAIT 행을 가져옵니다. 마지막 30 개의 WAIT 행을 가져 오려면 30으로 바꾸십시오.
...에 대한 ( 나는 = 1 , 나는 <= nr , 나는 ++,
new_row = wait_rows [ 나는 ] ;
// 행 목록에서 1보다 큰 간격을 찾습니다.
만약 (( new_row - old_row ) > 1 ,
에 집어 넣다 ( wait_start_list , ( old_row - 쐐기풀 + 1 )) ;
에 집어 넣다 ( wait_end_list , old_row ) ;
) ;
old_row = new_row ;
) ;
// 마지막 WAIT 세트를 처리한다.
old_row = wait_rows [ nr ] ;
에 집어 넣다 ( wait_start_list , ( old_row - 쐐기풀 + 1 )) ;
에 집어 넣다 ( wait_end_list , old_row ) ;
불행히도 저는 현재 JMP 만 있고 기본 SAS는 없습니다.하지만 제안에 감사드립니다.
JMP 포럼에 게시 했으므로 도움이되는지 아닌지 잘 모르겠습니다. 기본 SAS를 사용하면 올바른 도구를 사용하면 비교적 짧은 프로그램입니다.
데이터 last_30_waits;
group_num + 1;
n_waits = 0;
until (last.status 및 status = 'WAIT')까지 수행하십시오.
측정 값을 설정하십시오 (keep = status);
상태 별 정렬되지 않음;
status = 'WAIT'이면 n_waits + 1;
종료;
**이 시점에서 group_num은 WAIT 집합을 식별하고 n_waits는 그룹에있는 레코드 수를 나타냅니다.
n_found = 0;
until (last.status 및 status = 'WAIT')까지 수행하십시오.
측정 값을 설정;
상태 별 정렬되지 않음;
status = 'WAIT'이면 do;
n_found + 1;
n_found> = n_waits - 29이면 출력;
종료;
종료;
드롭 n_found;
운영;
행운을 빕니다.