if/then 문의 결과를 기반으로 새 열을 채워야 합니다.안녕하세요. if/then 문의 결과를 기반으로 새 열 그룹을 만들고 채우려고 합니다.
1 단계:
채워질 새로운 빈 열을 만들어야 합니다.(총 55개)
(각각의 새 열은 숫자형 연속형 필드입니다.)
각 열의 이름은 그룹의 각 55개 화합물 이름 뒤에 "_ppt"가 붙는 것과 일치합니다.예를 들어 "4:2 FTS"라는 화합물은 [4:2 FTS_ppt]라는 새 열을 생성합니다.
2 단계:
행별로 그룹의 55개 화합물 각각과 연관된 3개의 기존 열을 평가하는 if/then 문을 사용하여 새 열을 채웁니다.구체적으로,
if [RES_VALUE_4:2 FTS] >= [RL_4:2 FTS] THEN [4:2 FTS_ppt] = [RES_VALUE_4:2 FTS]
[RES_VALUE_4:2 FTS] < [RL_4:2 FTS] AND DETECT_FLAG_4:2 FTS] = N AND [RL_4:2 FTS] <= 3이면 [4:2 FTS_ppt] = 0.0009입니다.
[RES_VALUE_4:2 FTS] < [RL_4:2 FTS] AND DETECT_FLAG_4:2 FTS] = N AND [RL_4:2 FTS] > 3이면 [4:2 FTS_ppt] = NULL입니다.
다음은 복합 이름인 접미사가 붙은 기존 열 이름입니다.JMP Pro 17.0을 사용하고 있습니다.



어떤 지침이라도 가장 감사하겠습니다!
자동화 및 스크립팅콘텐츠 구성Re: if/then 문의 결과를 기반으로 새 열을 채워야 합니다.- 토론 커뮤니티의 목적은 JMP 사용자가 요청에 따라 작성된 스크립트를 얻을 수 있는 소스가 되는 것이 아닙니다.사용자가 JMP를 학습하는 데 도움이 되는 것입니다.
- 제공하신 의사 코드를 보면 시간을 들여 JMP 스크립팅 가이드를 읽어야 한다는 점은 분명합니다.JMP의 도움말 풀다운 메뉴에 있는 JMP 문서 라이브러리에서 사용할 수 있습니다.
- 다음은 귀하의 문제를 해결하는 데 도움을 드리기 위한 것입니다.귀하의 데이터가 없기 때문에 테스트되지 않았습니다.시간을 내어 코드를 공부하고 익히시기 바랍니다.함수는 스크립팅 색인 및 JSL 스크립팅 참조에 잘 설명되어 있습니다.
Names Default To Here( 1 );
groupList = {"RES_VALUE", "RES_TEXT", "DETECT_FLAG", "RL", "DILUTION_FACTOR"};
dt = Current Data Table();
// Find all of the different compounds. This is done by using the "RES_VALUE" columns
// and stripping off the compound names from each of them
compList = {};
For( i = 1, i <= N Cols( dt ), i++,
colName = Column( dt, i ) << get name;
If( Contains( colName, "RES_VALUE" ) == 1,
Insert Into( compList, Substr( colName, 11 ) )
);
);
// Create the columns
For Each( {comp, i}, compList,
Eval(
Parse(
"dt << New Column( \!"" || compList[i] || "_ppt" || "\!",
numeric,
continuous,
formula(
If( :\!"RES_VALUE "
|| comp || "\!"n >= :\!"RL " || comp || "\!"n,
x = :\!"RES_VALUE " || comp ||
"\!"n
);
If(
:\!"RES_VALUE " || comp ||
"\!"n < :\!"RL " || comp || "\!"n & :\!"DETECT_FLAG " || comp || "\!"n == \!"N\!" &
:\!"RL " || comp ||
"\!"n <= 3,
x = 0.0009
);
If(
:\!"RES_VALUE "
|| comp || "\!"n < :\!"RL " || comp || "\!"n & :\!"DETECT_FLAG " || comp || "\!"n == \!"N\!" &
:\!"RL "
|| comp || "\!"n > 3,
x = .
);
x;
)
);"
)
)
);
Re: if/then 문의 결과를 기반으로 새 열을 채워야 합니다.고마워요 짐.네, 잘 이해했습니다.작업에 뛰어들기 전에 jsl의 기초에 대해 더 많은 시간을 투자해야 합니다.
위의 코드는 모든 열을 올바르게 생성했지만 수식은 null 값(".")만 생성합니다.오류를 해결할 수는 없었지만 계속 노력하겠습니다.다시 한 번 감사드립니다.
Re: if/then 문의 결과를 기반으로 새 열을 채워야 합니다.샘플 데이터를 제공해 주시면 살펴보겠습니다.
Re: if/then 문의 결과를 기반으로 새 열을 채워야 합니다.고마워요 짐.내 데이터 세트의 작은 행 하위 집합이 포함된 jmp 테이블을 아래에 첨부했습니다.
Re: if/then 문의 결과를 기반으로 새 열을 채워야 합니다.두 가지를 바꿔야 했습니다.
- 수식에 사용되는 변수 x의 값은 행 실행마다 초기화되어야 합니다.
- 수식 실행을 억제 해제해야 합니다.
Names Default To Here( 1 );
groupList = {"RES_VALUE", "RES_TEXT", "DETECT_FLAG", "RL", "DILUTION_FACTOR"};
dt = Current Data Table();
// Find all of the different compounds. This is done by using the "RES_VALUE" columns
// and stripping off the compound names from each of them
compList = {};
For( i = 1, i <= N Cols( dt ), i++,
colName = Column( dt, i ) << get name;
If( Contains( colName, "RES_VALUE" ) == 1,
Insert Into( compList, Substr( colName, 11 ) )
);
);
// Create the columns
For Each( {comp, i}, compList,
Eval(
Parse(
"dt << New Column( \!"" || compList[i] || "_ppt" ||
"\!",
numeric,
continuous, formula(
x=.;
If( :\!"RES_VALUE "
|| comp || "\!"n >= :\!"RL " || comp || "\!"n,
x = :\!"RES_VALUE " || comp ||
"\!"n
);
If(
:\!"RES_VALUE " ||
comp || "\!"n < :\!"RL " || comp || "\!"n & :\!"DETECT_FLAG " || comp || "\!"n == \!"N\!" &
:\!"RL "
|| comp || "\!"n <= 3,
x = 0.0009
);
If(
:\!"RES_VALUE "
|| comp || "\!"n < :\!"RL " || comp || "\!"n & :\!"DETECT_FLAG " || comp || "\!"n == \!"N\!" &
:\!"RL "
|| comp || "\!"n > 3,
x = .
);
x;
)
);"
)
)
);
dt << Suppress Formula Eval( 0 );
Re: if/then 문의 결과를 기반으로 새 열을 채워야 합니다.고마워요 짐.귀하의 답변을 받은 후 곧 다시 돌아가려고 했지만 코드를 더버그하려고 했습니다.어떤 이유로 든 작동하지 못했습니다.디버거를 사용했는데 다음 메시지가 표시되었습니다.

귀하의 의견을 받았음을 알려드리고 싶었습니다. 계속 노력하겠습니다.감사해요.
Re: if/then 문의 결과를 기반으로 새 열을 채워야 합니다.
Re: if/then 문의 결과를 기반으로 새 열을 채워야 합니다.예!방금 작동하게되었습니다.도움을 주셔서 다시 한번 감사드립니다!