특정 날짜 범위와 관련된 특정 값만 선택하기 위한 스크립트 생성나는 이와 유사한 파일을 받았습니다.

시작일과 종료일 사이에 발생한 모든 코드를 가져오는 공식을 만들어 달라는 요청을 받았습니다. 이것을 공식으로 설정하는 방법을 잘 모르겠습니다. 시작일과 종료일 사이에 발생한 모든 코드를 가져오는 스크립트로 만들 수 있는 것일까요? 스크립트를 설정해 본 적이 없고 누군가가 스크립트를 만드는 방법을 안내해 주었으면 합니다.
감사해요!
데이터 탐색 및 시각화Re: 특정 날짜 범위와 관련된 특정 값만 선택하는 스크립트 생성커뮤니티에 오신 것을 환영합니다.
지정된 날짜 범위 내에서 행을 선택하고 선택한 행만 포함된 새 데이터 테이블을 만드는 실제 명령문입니다.
// Select the row that have the date range desired
dt << select where( :Start Date >= informat("01/10/2025","m/d/y") &
:End Date <= informat("04/30/2025","m/d/y"));
// Create the new table
dtSubset = dt << subset( selected columns(0), selected rows(1), output table("theSubset"));
다음은 먼저 예제 데이터 테이블을 만들고, 위의 줄을 실행하여 데이터 테이블을 선택해 만드는 전체 예제입니다.
(참고: 아래 예시는 원래 게시물에서 어떻게든 제외되었습니다. 누락에 대해 알려준 @jthi 에게 감사드립니다)
Names Default To Here( 1 );
// Create an Example data table
dt = New Table( "Example",
Add Rows( 20 ),
New Column( "Start Date",
Format( "m/d/Y" ),
set each value( Today() + In Days( Random Integer( 1, 100 ) ) )
),
New Column( "End Date",
Format( "m/d/Y" ),
set each value( :Start Date + In Days( Random Integer( 1, 50 ) ) )
)
);
// Select the row that have the date range desired
dt << select where(
:Start Date >= Informat( "01/10/2025", "m/d/y" ) & :End Date <=
Informat( "04/30/2025", "m/d/y" )
);
// Create the new table
dtSubset = dt << subset(
selected columns( 0 ),
selected rows( 1 ),
output table( "theSubset" )
);
새 테이블을 만드는 또 다른 흥미로운 대화형 방법은 데이터 필터를 사용하는 것입니다. 데이터 필터를 사용하면 사용자가 데이터 테이블에서 행을 대화형으로 선택할 수 있으며, 원하는 행을 선택하면 해당 행에서 새 테이블을 만들 수 있습니다.
이것으로: 데이터 테이블이 표시되면

행 풀다운 메뉴로 이동하여 "데이터 필터"를 선택하세요.

데이터 필터 창에서 시작 날짜와 종료 날짜를 선택하고 + 기호를 클릭합니다.

그러면 필터가 표시됩니다.
표시 및 포함 확인란을 클릭합니다. 필터 설정에서 행을 선택할 때 데이터 테이블의 행에 수행할 작업을 나타냅니다.

이제 필터를 설정하여 선택할 수 있습니다. 파란색 선을 원하는 별표 및 종료 날짜로 끌거나 각 필터에 대해 표시된 날짜 영역에 값을 직접 입력할 수 있습니다.
필터가 변경되면 데이터 테이블의 행이 어떻게 선택되는지 주의하세요.

원하는 행을 선택하면 데이터 필터 빨간색 삼각형의 작업 목록에서 하위 집합 표시 선택을 선택하여 새 데이터 테이블을 만들 수 있습니다. 데이터 필터 제목 옆에 있는 빨간색 삼각형을 클릭하고 옵션을 선택하기만 하면 됩니다.


Re: 특정 날짜 범위와 관련된 특정 값만 선택하는 스크립트 생성예시를 좀 더 쉽게 만들 수 있도록 예시 표를 제공해 주시겠습니까?
저는 이 문제에 대해 공식을 만들지 않고 스크립트를 만들 가능성이 큽니다. 각 행에 대해 date_x가 시작 날짜와 종료 날짜 사이에 있는 모든 code_x 값을 추출하고 싶을 것으로 가정합니다. 어디에 기록해야 합니까? 중복은 어떻게 해야 합니까? 데이터 형식을 변경할 수 있습니까(데이터를 쌓을 수 있습니까)?
@txnelson JMP 커뮤니티에서 전체 예제를 삭제했나요?
Re: 특정 날짜 범위와 관련된 특정 값만 선택하는 스크립트 생성이것은 사용할 수 있는 예시 표입니다. 맞습니다. 각 행을 보고 시작 날짜와 종료 날짜 사이의 각 날짜에 대한 코드를 가져와야 합니다. 중복이 있는지는 중요하지 않습니다. 궁극적으로 모든 코드가 같은지 또는 각 시간 프레임에 다른 코드가 있는지 알아야 합니다. 각 행에 대해 시작 날짜와 종료 날짜 사이에 있는 코드가 모두 "2"인지, 모두 "3"인지 또는 코드의 조합인지 알아야 합니다.
이게 어떤 종류의 스크립트여야 할 것 같아요. 효과가 있는 공식이 떠오르지 않거든요. 스크립트를 만든 경험이 없어서 도움을 주시면 감사하겠습니다!!
Re: 특정 날짜 범위와 관련된 특정 값만 선택하는 스크립트 생성최종 요구 사항을 염두에 두면 훨씬 더 간단해질 가능성이 있지만 정확한 사양/결과 열이 없으므로 도움이 될 것이라고 생각되는 것을 방금 만들었습니다.
Names Default To Here(1);
dt = Open("$DOWNLOADS/example table.jmp");
Try(Column(dt, "Date 1") << Set Name("date_1"));
date_cols = Filter Each({colname}, dt << Get Column Names("String"),
Starts With(colname, "date_");
);
code_cols = Filter Each({colname}, dt << Get Column Names("String"),
Starts With(colname, "code ");
);
dt << New Column("Result", Character, Multiple Response);
For Each Row(dt,
dates = dt[Row(), date_cols];
between_bin = :"Start date"n <= dates <= :"Stop date"n;
between_idx = Loc(between_bin);
If(N Items(between_idx) > 0,
codes = dt[Row(), code_cols[between_idx]];
valid = Loc(codes);
If(N Items(valid) == 0,
codes = {};
,
codes = As List(codes[valid`]);
);
,
codes = {};
);
res = Transform Each({code}, codes,
Char(code);
);
:Result = Concat Items(res, ", ");
);

Re: 특정 날짜 범위와 관련된 특정 값만 선택하는 스크립트 생성Jarmo의 코드는 굉장합니다. 그가 문제에 어떻게 접근하고 해결하는지 보는 것을 즐깁니다. 하지만 제 인생의 대부분 동안, 저는 동료, 친구, 배우자, 아이들에게 생각이 이상하다고 여겨졌습니다. 좋은 날에는 "너드"라고 불립니다.
그래서 제 삶의 위치를 고려해 볼 때, 대부분 사람들은 제가 생각하는 방식대로 생각하지 않는다는 걸 알게 됐습니다.
@PruningTheSpark는 다음과 같이 말합니다.
" 이건 일종의 스크립트가 필요할 것 같아요. 제대로 작동하는 공식이 떠오르지 않거든요. 스크립트를 만든 경험이 없어서 도움을 주시면 감사하겠습니다!! ".
저는 JMP 사용자 대부분이 PruningTheSpark의 입장에 가깝다고 생각합니다. PruningTheSpark는 이 문제에 대한 비스크립팅 솔루션이 없다고 생각할 수 있지만, JMP의 상호 작용적인 기능으로 데이터를 조작하는 것은 정말 강력합니다. 그래서 아래에 PruningTheSparks 문제를 해결하는 데 필요한 상호 작용적인 단계를 정리했습니다.
제공된 샘플 데이터 테이블에서 시작하여 약간 수정했습니다. Jamo의 스크립트 결과를 보면 어느 행에도 두 개 이상의 유효한 코드가 없음을 보여줍니다. 두 개 이상의 코드가 잠재적이라는 점을 감안하여 행 2에 여러 개의 코드가 있는 행 2에 표시되는 코드를 추가했습니다.

첫 번째 작업은 시작 날짜와 종료 날짜에 속하는 모든 코드를 찾는 것입니다. 6개의 다른 코드 열이 있으므로 이 모든 것을 한 번에 수행하는 가장 쉬운 방법은 데이터를 쌓는 것입니다.
테이블 => 스택

날짜와 코드 열을 스테이킹하는 다중 시리즈 스택입니다.
이제 누락된 값이 있는 모든 코드를 제거할 수 있습니다. 누락된 값은 결과에 반영되지 않기 때문입니다. 그래서 모든 코드가 포함된 Data 2 열에서 누락된 값이 있는 셀 하나를 선택한 다음 마우스 오른쪽 버튼을 클릭하고 Select Mating Cells를 선택합니다.

이는 열 Data 2에 대해 누락된 값이 있는 모든 행을 선택합니다.
RowState 열을 마우스 오른쪽 버튼으로 클릭하고 행 삭제를 선택하세요.

그리고 코드가 있는 행만 남습니다.

이제 시작 날짜와 종료 날짜에 속하는 코드를 결정해야 합니다. 이를 위해 "in between"이라는 새 열을 만들 것입니다. 이 열에는 다음 공식이 있습니다.

원래 테이블의 날짜가 포함된 열 Data가 범위 내에 있는 경우 1을, 범위 밖에 있는 경우 0을 갖는 행을 나타냅니다.

결측값이 있는 코드를 삭제할 때와 동일한 기술을 사용하여 0이 있는 행을 선택하여 삭제할 수 있습니다.

테이블을 정리하려면 더 이상 필요하지 않은 일부 열을 삭제할 수 있습니다.

이제 작업은 코드를 단일 행으로 다시 가져오는 것입니다. 이를 위해 간단한 분할을 수행할 수 있습니다.
테이블 =>분할


이제 코드 열을 하나의 열로 결합하려면 Combine Columns라는 열 유틸리티를 사용할 수 있습니다. 결합할 열을 선택한 다음
열 =>유틸리티 =>열 결합

그러면 새 열의 이름을 입력할 수 있는 입력 상자가 나타나고 항목 사이에 어떤 구분 기호를 넣을 것인지(이 경우에는 ",")를 입력해야 합니다.

이로 인해 테이블에 새 열이 생성됩니다.

더 이상 필요하지 않은 열을 삭제하여 테이블을 정리합니다.

이제 해야 할 일은 결과를 원래 데이터 테이블로 다시 옮기는 것입니다. 이를 위해 업데이트 플랫폼이 해결책이 될 것입니다. 원래 테이블을 클릭하고
테이블 => 업데이트

업데이트를 가져올 테이블을 채우고 원본 테이블의 record_id를 분할 테이블의 record_id와 일치하도록 선택한 다음 확인을 클릭하면 원본 테이블에 솔루션이 포함됩니다.

스크립트는 사용되지 않았으며 간단한 수식 열 2개만 필요했습니다.
이제, 이러한 단계를 거치면서 JMP는 실행된 대화형 단계를 만드는 데 필요한 JSL을 로그에 저장합니다. 따라서 JSL의 일부를 스크립트에 복사하면 마지막에 실행하면 눈 깜짝할 새에 솔루션을 완성하는 스크립트를 만들 수 있습니다.
names default to here(1);
dt = data table( "Example Table" );
// Stack data table
// → Data Table( "Stacked" )
dtStacked = Data Table( "example table" ) << Stack(
columns(
:date_1, :code 1, :date_2, :code 2, :date_3, :code 3, :date_4, :code 4,
:date_5, :code 5, :date_6, :code 6
),
Number of Series( 2 ),
Output Table( "Stacked" )
);
wait(0);
// Delete selected rows
Data Table( "Stacked" ) << Select Where( Is Missing( :Data 2 ) ) << Delete Rows;
// Delete columns
Data Table( "Stacked" ) << Delete Columns( :Label, :Label 2 );
// New column: is between
Data Table( "Stacked" ) << New Column( "is between",
Numeric,
"Continuous",
Format( "Best", 12 )
);
// Change column formula: is between
Data Table( "Stacked" ):is between << Set Formula(
:Data >= :Start date & :Data <= :Stop date
);
// Delete selected rows
Data Table( "Stacked" ) << Select Where( :is between == 0 ) << delete rows;
// Delete column: is between
Data Table( "Stacked" ) << Delete Columns( :is between );
// Delete columns
Data Table( "Stacked" ) << Delete Columns( :Stop date, :Start date, :Data );
// Split data table
// → Data Table( "Split" )
Data Table( "Stacked" ) << Split(
Split By( :Data 2 ),
Split( :Data 2 ),
Group( :record_id ),
Output Table( "Split" ),
Sort by Column Property
);
// Combine columns
Data Table( "Split" ) << Combine Columns(
columns( :"1"n, :"2"n, :"3"n ),
Column Name( "Result" ),
Delimiter( "," )
);
// Delete columns
Data Table( "Split" ) << Delete Columns( :"1"n, :"2"n, :"3"n );
// Update data table
Data Table( "example table" ) << Update(
With( Data Table( "Split" ) ),
Match Columns( :record_id = :record_id )
);
새로운 워크플로를 열고 레코더를 켜고 단계별로 진행하면 나중에 솔루션을 만드는 데 사용할 수 있는 워크플로가 생성됩니다.

Re: 특정 날짜 범위와 관련된 특정 값만 선택하는 스크립트 생성귀하의 도움에 감사드립니다!
Re: 특정 날짜 범위와 관련된 특정 값만 선택하는 스크립트 생성도와주셔서 정말 감사합니다! 스크린샷이 정말 도움이 됩니다!