안녕하세요, 저는 모든 언어로 스크립트를 쓰는 초보자입니다. 저는 현재 간단한 연습 과제라고 생각되는 것을 훑어보고 있습니다. 저는 JMP18을 사용하고 있습니다. 제 목표는 시간이 지남에 따라 증가하는 데이터 세트에 대해 수행하는 일상적인 작업을 자동화하는 것입니다. 일상적인 작업은 먼저 시간 척도를 결정한 다음 대규모 데이터 세트에 대해 해당 시간 척도에 따른 데이터의 변화를 보여주는 것입니다. 제가 이에 접근하는 기본적인 방법은 모든 초기 데이터를 채우기 위해 새 열을 만들고 더 많은 열에 수식을 사용하여 차이를 얻는 것입니다. 누군가가 더 나은 제안이 있다면 감사하겠습니다. 제가 있는 곳은 다음과 같습니다.
기본적으로 저는 데이터 세트를 가지고 있으며 다음을 성취하고 싶습니다.
1) 날짜와 시간 열을 가져와서 하나의 열로 합친 다음, 최소값을 찾아서 시작 날짜를 만들려고 합니다. 그런 다음 시간을 빼서 데이터 간의 시간 차이를 볼 수 있습니다. formula() 함수로 이 모든 것이 충분히 간단했습니다. 여기 있는 모든 것이 잘 작동합니다.
2) 여러 데이터 열에 비슷한 작업을 하고 싶지만, 이전에 한 것처럼 초기 값을 찾을 수 없습니다. 초기 데이터는 세 번째 열(아래 코드에서 Unique_Fruit라고 함)의 모든 고유 항목에 대해 이전에 한 작업에서 찾은 최소 시간에 따라 결정됩니다. 이 포럼을 위해, 각 unique_fruit에 대해 해당 과일의 데이터 초기 값이 포함된 열을 만들어서 실제 데이터 열에서 변경 사항을 빠르게 계산할 수 있도록 하려고 합니다.
현재 JSL 스크립트는 아래와 같습니다. 무엇을 해야 할지 알아내지 못한 더미 코드 공식이 있습니다. If 함수를 사용하여 시간이 서로 같은지 확인하고 해당 셀에만 값을 설정하는 단계입니다. 원래는 for 루프를 사용하여 공식을 반복하는 것이었지만 작동하지 않는 것 같았습니다.
DataTable = Current Data Table();
New Column( "Date Number Format", Numeric, "Continuous" );
For( i = 1, i <= N Rows( DataTable ), i++,
DataTable:Date Number Format[i] = Num( DataTable:Key_Date[i] );
);
New Column( "Time Number Format", Numeric, "Continuous" );
For( i = 1, i <= N Rows( DataTable ), i++,
DataTable:Time Number Format[i] = Num( DataTable:Key_Time[i] );
);
New Column( "Current_Time", Numeric, "Continuous" );
For( i = 1, i <= N Rows( DataTable ), i++,
DataTable:Current_Time[i] = DataTable:Date Number Format[i] + DataTable:Time Number Format[i];
);
New Column( "Unique_Fruit", Character, "Nominal" );
For( i = 1, i <= N Rows( DataTable ), i++,
DataTable:Unique_Fruit[i] = DataTable:Fruit[i] || "-" || DataTable:Type[i];
);
New Column( "Starting_Date_Number_Format", Numeric, "Continuous",
Formula( Col Minimum( :Current_Time, :Unique_Fruit ) )
);
New Column( "Minutes", Numeric, "Continuous",
Formula( Date Difference( :Starting_Date_Number_Format, :Current_Time, "Minute", "fractional" ) )
);
New Column( "Days", Numeric, "Continuous",
Formula( Date Difference( :Starting_Date_Number_Format, :Current_Time, "Day", "fractional" ) )
);
New Column( "Weeks", Numeric, "Continuous",
Formula( Date Difference( :Starting_Date_Number_Format, :Current_Time, "Week", "fractional" ) )
);
New Column( "Months", Numeric, "Continuous",
Formula( Date Difference( :Starting_Date_Number_Format, :Current_Time, "Month", "fractional" ) )
);
New Column( "Initial_Taste", Numeric, "Continuous",
Formula(
If( :Current_Time == :Starting_Date_Number_Format, :Key_Taste, . )
)
);
For( i = 1, i <= N Rows( DataTable ), i++,
If( DataTable:Current_Time[i] == DataTable:Starting_Date_Number_Format[i],
DataTable:Initial_Taste[i] = DataTable:Key_Taste[i];
);
);
New Column( "Delta_Taste", Numeric, "Continuous",
Formula( :Key_Taste - :Initial_Taste )
);
New Column( "%_Change_Taste", Numeric, "Continuous",
Formula( ( :Delta_Taste / :Initial_Taste ) * 100 + 100 )
);</CODE></P><BR /></LINGO-BODY><LINGO-LABS id="lingo-labs-844919" slang="en-US" mode="CREATE"><LINGO-LABEL>자동화 및 스크립팅</LINGO-LABEL></LINGO-LABS><LINGO-SUB id="lingo-sub-844929" slang="en-US" mode="CREATE">Re: 스크립트를 작성하려는 초보자 / 수식 함수 내에서 반복하는 방법은?</LINGO-SUB><LINGO-BODY id="lingo-body-844929" slang="en-US" mode="CREATE"><P>정답이 있는 예시 데이터 세트 + 열을 제공할 수 있습니까? 아마도 이와 같은 것을 사용하여 초기 값을 얻을 수 있지만, 각 범주에 대해 첫 번째 값을 가져오므로 비교를 수정해야 합니다.</P>
<BR />
<PRE><CODE class=" language-jsl">Col Cumulative Sum(If(Row() == Col Min(Row(), :age), :height, .), :age)
:age는 unique_fruit이고 :height는 값 열입니다. Lag()와 변수를 활용할 수도 있습니다.
스크립트를 좀 더 강력하게 만들기 위해 몇 가지 변경을 할 수도 있습니다.
- Names Default To Here(1)로 스크립트를 시작하세요.
- 데이터 테이블에 대한 참조가 있으므로 사용하십시오.
- DataTable << 새 열(...
- JMP에 Datatable()이라는 함수가 있으므로 DataTable을 dt 또는 이와 유사한 것으로 변경하는 것도 고려할 것입니다.
- 데이터 테이블을 반복할 때는 For 대신 For Each Row를 사용합니다. 이는 특수한 사용 사례이기 때문입니다.
- 수식 없이 JMP 테이블에 새 열을 추가하려는 경우 몇 가지 옵션이 있습니다.
- 새 열 + 수식 + 수식 실행 + 수식 조합 삭제 사용
- 새 열을 만들고 데이터 테이블에서 반복합니다(당신이 하는 것처럼)
- 그런 다음 << Apply Formula를 사용하는 약간 까다로운 방법이 있지만 나는 먼저 이 방법을 사용할 것입니다(보통 나는 첫 번째 방법을 사용합니다)
커뮤니티에 오신 것을 환영합니다.
저는 샘플 데이터 테이블인 Jarmo에 동의합니다.
또한 기대하는 결과가 무엇인지에 대한 모의 사례를 제공해 주시면 좋겠습니다.
제안해 주셔서 감사합니다. 저는 모의 데이터 세트를 시도하고 있으며 현재 수동으로 하는 일은 다음과 같습니다. 초기 값을 설정하기 위해 각 고유 항목을 살펴보고 해당 셀의 데이터를 호출하여 전체 열을 채운 다음 계산의 다음 부분으로 넘어갑니다. 나머지 스크립트도 제안해 주신 내용으로 업데이트해 보겠지만, 제 생각에는 주요 문제가 아직 해결되지 않은 것 같습니다(아니면 제가 아직 이해하지 못한 것일 수도 있습니다.)
일반적으로 올바른 질문에 답하는 것보다 모형 데이터를 만드는 데 더 많은 시간이 걸리기 때문에 해결되지 않았습니다. 초기 값에 대해 이와 같은 것을 활용할 수 있어야 합니다.
Col Min(If(:Date Number Format == Col Min(:Date Number Format, :Unique_Fruit), :Key_Taste, .), :Unique_Fruit)
이것이 이것을 만드는 유일한 방법은 아니지만 이와 비슷한 것이 꽤 자주 작동합니다.
정말 감사합니다. 명확히 하자면, 저는 당신의 첫 번째 응답을 비난하려고 한 것이 아니라, 몇 번의 반복에서 구현하려고 했고 여전히 뭔가를 놓치고 있다고 생각했습니다. 계속했어야 했는데, 결국 당신이 여기에 보여준 답에 도달했을 테니까요(결국), 하지만 앞서 말했듯이 저는 이런 것들을 스크립팅하는 데 초보라 느리게 진행되고 있습니다.
궁금해서 묻는 건데, else에 왜 "."이 들어가 있나요?
누락된 값은 Col Min이 누락된 값을 무시하여 선택할 수 있는 옵션을 하나만 가지도록 "강제"하려는 것입니다.
이러한 유형의 공식을 더 잘 이해하기 위해 여러 부분으로 나눌 수 있습니다(때로는 여전히 매우 난해할 수 있음)
//col1
Col Min(:Date Number Format, :Unique_Fruit)
//col2
:Date Number Format == :col1
//col3
If(:col2, :Key_Taste, .)
//col4
Col Min(:col3, :Unique_Fruit)

안녕하세요, 이걸 가지고 놀다가 한 가지 생각이 더 들었습니다. 이걸 게시할 때 원래 해야 한다고 생각했던 것에 더 가까운 걸 하고 싶다면 어떻게 해야 할까요? 제가 하는 일은 목록을 저장하는 변수를 작성한 다음, 그 목록을 반복해서 코드를 실행하여 수식을 채우는 것입니다. 변수를 채우는 대신 목록 값 중 하나로 업데이트하는 대신 수식 내부에 그대로 둡니다. 이건 수식 함수 내에서 할 수 있는 일인가요?
여기서 설명해 주셔서 감사합니다. 저는 이 작은 프로젝트를 계속하면서 이것으로 놀고 있고 어디까지 갈 수 있는지 보고 있습니다.
수식 내에서 값 목록을 가져오거나 값 목록을 수집할 수 있지만 값을 업데이트하는 방법에 주의해야 합니다(As Constant 또는 If(Row() == 1,...)를 사용하면 도움이 될 수 있음). 또한 수식 내에서 루프가 자주 트리거되므로 피하는 것이 좋습니다.
Lag()를 사용할 수 있지만 이렇게 하려면 데이터를 정렬해야 합니다(정렬 없이도 가능하지만 금방 복잡해질 수 있음). 하지만 일반적으로 아이디어는 다음과 같습니다.
If(Row() == 1,
init_taste = :Key_Taste
);
If(:Unique_Fruit != Lag(:Unique_Fruit),
init_taste = :Key_Taste;
);
init_taste;
날짜 숫자 형식과 Unique_Fruit별로 데이터를 정렬했다는 점에 유의하세요.