동일한 데이터 필터를 여러 테이블에 동적으로 적용할 수 있는 방법은 무엇입니까?<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />안녕하세요 여러분,
저는 현재 JMP를 사용하여 데이터 분석 도구를 만들고 있습니다. 기본적으로 JMP를 사용하여 클라이언트가 다른 소프트웨어를 사용하여 생성된 시뮬레이션 출력과 상호 작용할 수 있도록 합니다.
시뮬레이션 출력은 특성은 다르지만 식별자는 동일한 여러 테이블에 저장됩니다. 예를 들어, 한 테이블은 1개의 시뮬레이션 복제와 관련된 전역적으로 출력 값을 보유하고, 다른 테이블은 시뮬레이션 복제에 있는 각 에이전트와 연관된 출력을 보유하고(따라서 복제당 여러 라인을 가짐), 다른 테이블은 각 시간 단계에 대한 출력을 보유할 수 있습니다. 각 시뮬레이션 복제(따라서 복제당 많은 라인 포함). 모든 테이블의 공통점은 식별자와 입력 매개변수가 있는 열입니다.
이제 과제: 모든 데이터 테이블을 동시에 필터링하는 데이터 필터를 만들 수 있기를 원합니다(물론 이것은 공유하는 정보(예: 식별자)를 기반으로 수행됨). 내 기본 목표는 그래프 등을 사용하여 다른 테이블의 정보를 동적으로 표시할 수 있는 동시에 가장 편리한 테이블 형식으로 데이터를 구성하는 것입니다.
생각이 있으시면 알려주세요!
미리 감사합니다
Re: 동일한 데이터 필터를 여러 테이블에 동적으로 적용할 수 있는 방법은 무엇입니까?JSL:
http://support.sas.com/demosdownloads/downarea_t4.jsp?productID=109646
우리가 '행 상태 처리기'를 추가한 이후로 다소 오래되었고 (다행히도!) 구식입니다(JMP 10에서는 생각합니다). 이것은 다양한 용도로 사용되며 아래 코드는 이 경우 어떻게 악용할 수 있는지 보여줍니다.
// // ian.cox@jmp.com : 2014년 11월 03일
// 행 상태 핸들러를 사용하여 여러 자식 테이블을 부모 테이블에 연결하는 방법에 대한 데모
NamesDefaultToHere ( 1 ) ;
// 사용할 테이블 만들기
dt1 = 새 테이블 ( "1 번 테이블" ,
새 열 ( "ID" , 숫자 , 연속 , 가치 (( 1 :: 10 ) ` )) ,
새 열 ( "응답" , 숫자 , 마디 없는 , 공식 ( 랜덤노멀 ( 0 , 1 )))
) ;
dt2 = 새 테이블 ( "표 2" ,
새 열 ( "ID" , 숫자 , 연속 , 공식 ( 임의의 정수 ( 1 , 5 ))) ,
새 열 ( "속성 2" , 숫자 , 마디 없는 , 공식 ( 임의의 정수 ( 0 , 10 ))) ,
행 추가 ( 20 )
) ;
dt3 = 새 테이블 ( "표 3" ,
새 열 ( "ID" , 숫자 , 연속 , 공식 ( 임의의 정수 ( 1 , 11 ))) ,
새 열 ( "속성 3" , 숫자 , 마디 없는 , 공식 ( 임의의 정수 ( 0 , 100 ))) ,
행 추가 ( 30 )
) ;
// 유틸리티 함수:
// 데이터 테이블, 그 안의 열 및 해당 열의 일부 값이 주어지면 해당하는 모든 행을 선택합니다.
// 'col'이 숫자(문자)가 되도록 허용해야 하며, 이 경우 'vals'는 행렬(목록)입니다.
selectMatchingRows =
기능 ({ dt , 안부 , 발 } ,
행2선택 = [] ;
만약에 ( IsMatrix ( 발 ) ,
// 'col'은 숫자입니다.
을 위한 ( 나 = 1 , 나 <= NRow ( 발 ) , 나 ++,
행2선택 = VConcat ( 행2선택 , dt << GetRows어디 ( 안부 == 발 [ 나 ])) ;
)
,
// 'col'은 문자입니다.
을 위한 ( 나 = 1 , 나 <= NItems ( 발 ) , 나 ++,
행2선택 = VConcat ( 행2선택 , dt << GetRows어디 ( 안부 == 발 [ 나 ])) ;
)
) ;
dt << 행 선택 ( 행2선택 ) ;
) ;
// '마스터' 테이블(dt1)에 할당할 행 상태 핸들러를 만듭니다. 여러 행 선택을 허용합니다.
SelectionToOtherTables 전파 =
기능 ({ 엑스 } ,
// 선택된 행을 가져옵니다.
선택된 행 = dt1 << GetSelectedRows ;
만약에 ( NRow ( 선택된 행 ) > 0 ,
// 해당 ID를 가져옵니다.
아이디 = dt1 : ID [ 선택된 행 ] ;
// dt2에서 해당 행을 선택합니다.
selectMatchingRows ( dt2 , 특급 ( : ID ) , 아이디 ) ;
// dt3에서 해당 행을 선택합니다.
selectMatchingRows ( dt3 , 특급 ( : ID ) , 아이디 ) ;
,
// 기존 선택 지우기
dt2 << 지우기 선택 ;
dt3 << 지우기 선택 ;
) ;
) ;
// 핸들러를 dt1에 할당
rsh = dt1 << MakeRowStateHandler ( SelectionToOtherTables 전파 ) ;
Re: 동일한 데이터 필터를 여러 테이블에 동적으로 적용할 수 있는 방법은 무엇입니까?나는 원래의 접근 방식보다 문제를 처리하는 훨씬 더 효율적인 방법을 찾았습니다.
dtglobal의 행 상태(포함 및 선택됨)를 dt1, dt2, dt3으로 전송하려면 다음을 사용할 수 있습니다. 대용량 데이터 테이블에서도 빠르고 동적으로 작동합니다. 각 테이블에 해당 '키'(숫자 값)가 있는 열만 있으면 됩니다.
//dtglobal의 행 상태를 다른 테이블로 전송
statehandler = dtglobal << 행 상태 핸들러 만들기( statetransfer );
statetransfer = 함수({Y},
dt1 << 행 상태 지우기;
dt2 << 행 상태 지우기;
dt3 << 행 상태 지우기;
excluderows = dtglobal << 제외된 행 가져오기;
excludekeys = dtglobal:Key << 값 가져오기;
제외 키 = 제외 키[제외 행];
dt1 << Select Where( Contains( Matrix( excludekeys ), :Key ) );
dt1 << 제외;
dt2 << Select Where( Contains( Matrix( excludekeys ), :Key ) );
dt2 << 제외;
dt3 << Select Where( Contains( Matrix( excludekeys ), :Key ) );
dt3 << 제외;
selectrows = dtglobal << 선택한 행 가져오기;
selectkeys = dtglobal:Key << 값 가져오기;
선택키 = 선택키[선택행];
dt1 << Select Where(Contains( Matrix( selectkeys ), :Key ) );
dt2 << Select Where(Contains( Matrix( selectkeys ), :Key ) );
dt3 << Select Where(Contains( Matrix( selectkeys ), :Key ) );
)
;
Re: 동일한 데이터 필터를 여러 테이블에 동적으로 적용할 수 있는 방법은 무엇입니까?답장을 보내주셔서 감사합니다.
나는 이 예와 비슷한 것을 실험해 왔다: http://support.sas.com/demosdownloads/downarea_t4.jsp?productID=109646 .
테이블 2의 포함/제외 상태가 테이블 1의 상태에 의존하는 두 개의 테이블을 만들었습니다(앞으로 이것은 선택됨, 표시됨, 색상 등과 같은 다른 상태도 포함하도록 확장될 수 있음).
불행히도 결과는 아직 강력하지 않습니다. 때때로 작동하지만 몇 개의 행을 필터링(포함/제외)하거나 다른 작업을 수행하면 작동이 중지됩니다. 현재 데이터 테이블과 관련이 있을 수 있다고 생각하지만 확실하지 않습니다. 스크립트 창에서 작성한 스크립트(table1에 포함되지 않음)를 사용하는 것이 약간 더 강력하지만 여전히 때때로 아무 작업도 수행하지 못합니다.
이 접근 방식을 더욱 개선할 수 있는 방법에 대한 의견을 보내주시면 감사하겠습니다!
첨부 파일의 두 테이블에 대한 스크립트를 실행하여 직접 확인하십시오. 실제로 테이블을 연결하는 데 사용하는 스크립트도 첨부 파일 하단에 있습니다.
간단한 요약:
테이블 1과 테이블 2에는 모두 RepID 열이 있습니다.
표 1의 행이 포함/제외된 경우 열 :Excluded가 이 작업을 수행합니다(어떤 이유로 테이블을 시작한 후 dt/dt2 참조가 손실되므로 여기에서 다시 정의합니다).
공식(
If( 제외됨( 행 상태( 행() ) ),
dt = 데이터 테이블( "linktable1.jmp" );
dt2 = 데이터 테이블( "linktable2.jmp" );
현재 데이터 테이블( dt );
1;
,
dt = 데이터 테이블( "linktable1.jmp" );
dt2 = 데이터 테이블( "linktable2.jmp" );
현재 데이터 테이블( dt );
0;
)
)
),
그런 다음 column :parser는 다음을 수행합니다.
If(:Excluded == 1, Eval(Parse(:ScriptEx)), :Excluded == 0, Eval(Parse(:ScriptInc)))
이 스크립트를 참조하는 항목(:ScriptEx에서):
RepIDex = dt:RepID[];
제외 목록 = 목록();
Excludelist = As List( dt2 << 행 가져오기 Where( dt2:RepID == RepIDex ) );
현재 데이터 테이블( dt2 );
Eval( For( i = 1, i <= N Items( Excludelist ), i++, Row State( Excludelist) ) = 제외된 상태( 1 ) ) );
전체 스크립트 inc에 대한 첨부 파일을 참조하십시오. 테이블.
Re: 동일한 데이터 필터를 여러 테이블에 동적으로 적용할 수 있는 방법은 무엇입니까?동시에 필터링할 수 있는지는 모르지만 각 테이블에 플래그 열을 추가할 수 있습니다. 여기서 1은 이 행이 일부 기준을 충족함을 의미하고 0은 그렇지 않음을 의미합니다.