JMP는 열 수식을 어떻게 평가하나요?@txnelson은 방금 상수로 summary()를 내부적으로 사용했습니다 .
https://community.jmp.com/t5/Discussions/Alphabetical-Ranking-of-Nominal-Data/mp/822725/highlight/true#M100245
As Constant( Summarize( theLevels = by( :age ) ) );
Contains( theLevels, Char( :age ) );
매우 흥미로운 접근 방식이에요!
상수인 경우 스크립팅 인덱스는 다음 예를 제공합니다.
Names Default To Here( 1 );
New Table( "As Constant Demo Table 1",
Add Rows( 10 ),
New Column( "Non-Constant", Formula( Random Uniform() ) ),
New Column( "Constant", Formula( As Constant( Random Uniform() ) ) )
);
this is easy to understand - As Constant( Random Uniform() ) is executed just once and the return value is used for the other rows.
The thing that puzzled me: The return value of 요약하다 is empty and actually, it's theLevels which we are interested in.
그래서 실제 비결은 다음과 같습니다.
상수로 : "한 번만 실행됩니다" !
매우 유용해요!
다음과 같은 용도로 사용할 수 있습니다:
as constant("JMP just started to evaluate column xyz");
이 트릭을 다른 응용 프로그램에도 사용해 보겠습니다. 보조 데이터 테이블을 여는 것입니다.
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
dt << New Column( " col",
Formula(
as constant (
dt = Current Data Table();
dtsum = dt << summary( Group( :age, :height ) );
nr = N Rows( dt );
);
Eval( (EvalExpr(myrows= dtsum << get rows where( :age == Expr(dt:age[row()])))));
Print(:age, myrows);
dtsum[myrows, 2]
)
);
하지만 예상했던 만큼 쉽지는 않네요....
음, 꽤 늦었어요. 왜인지는 모르겠어요.

자동화 및 스크립팅Re: JMP는 열 수식을 어떻게 평가하나요?다음 질문은 - 따라서 이 글의 제목이기도 합니다.
dtsum을 닫으면 JMP에서 항목이 삭제되는 이유는 무엇인가요?
Try(close(dt, nosave));
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
Data Table( "Big Class" ) << Sort(
By( :age, :height ),
Replace Table
);
dt << New Column( " col",
Formula(
local({tmp,myAge},
as constant (
dt0 = Current Data Table();
dtsum = dt << summary( Group( :age, :height ) );
//dtsum:age << set name(age2);
nr = N Rows( dt0 );
);
myage = dt:age[row()];
Eval (Eval Expr(myrows = dtsum << get rows where( :age == Expr(myAge))));
Print(myRows);
tmp = contains(dtsum[myrows,2], :height);
if(row()==nr, dt<< runformulas();wait(1);close(dtsum, noSave);Caption("done"));
tmp
)));Re: JMP는 열 수식을 어떻게 평가하나요?문제 1은 다음을 통해 수정할 수 있습니다.
dt << New Column( " col",
Expression,
set each value (
local({tmp,myAge},
as constant (
dt0 = Current Data Table();
dtsum = dt << summary( Group( :age, :height ) );
//dtsum:age << set name(age2);
nr = N Rows( dt0 );
);
myage = dt:age[row()]; // save as variable and use later here ↘:backhand_index_pointing_down:</img>
Eval (Eval Expr(myrows = dtsum << get rows where( :age == Expr(myAge))));
dtsum[myrows,2]
)));Re: JMP는 열 수식을 어떻게 평가하나요?와, 두번째는 참 놀랍네요. 이걸로 고칠 수 있어요
//dense rank - with groupby
dt << New Column( " col",
set each value( // <- the first change is here
local({tmp,myAge},
as constant (
dt = Current Data Table();
dtsum = dt << summary( Group( :age, :height ) );
//dtsum:age << set name(age2);
nr = N Rows( dt );
);
myage = dt:age[row()];
Eval (Eval Expr(myrows = dtsum << get rows where( :age == Expr(myAge))));
tmp = contains(dtsum[myrows,2],dt:height); // <- the second change is here : use dt:height instead of :height to force JMP to use the right table!
if(row()==nr, close(dtsum, noSave));
tmp
)));이렇게 하면 이전 방식에서 여러 개의 "0" 항목과 관련된 문제도 해결됩니다.
그래서, 그 질문의 요지는 다음과 같지 않았습니다:
dtsum 테이블이 닫혀 있으면 JMP가 dt의 값을 삭제하는 이유는 무엇입니까?
실제 질문은 다음과 같았습니다:
JMP가 데이터 테이블 dt 에 대한 항목을 계산할 때 dt:height 대신 dtsum :height 를 사용하는 이유는 무엇입니까?
열린 질문: dt:height가 set each value() 에 대한 문제만 해결하고 formula() 에 대해서는 해결하지 않는 이유는 무엇입니까?
Re: JMP는 열 수식을 어떻게 평가하나요?아,
dt << New Column( "dense rank_ grouped by",
Character,
formula (
local({tmp,myAge},
as constant (
dt = Current Data Table();
dtsum = dt << summary( Group( :age, :height ) );
//dtsum:age << set name(age2);
nr = N Rows( dt );
);
rw = row();
myage = dt:age[row()];
Eval (Eval Expr(myrows = dtsum << get rows where( dtsum:age == Expr(myAge)))); // <- use dtsum:age !!!
tmp = contains(dtsum[myrows,2], dt:height[rw]); // <- use dt:height !!!!
if(row()==nr, close(dtsum, noSave));
tmp
)));
@jthi , 얼마 전에 비슷한 문제가 있었던 걸 기억합니다. 두 테이블의 열 이름이 겹치는 경우 충돌이 발생하는 거죠.
찾으면 링크를 추가하겠습니다.
Re: JMP는 열 수식을 어떻게 평가하나요?여기서 언급한 문제 , 즉 루프 내에서 각 값, 동일한 열 이름을 가진 테이블 및 col 통계 함수를 조합하여 사용할 때 발생하는 버그를 말씀하시는 건가요?
Re: JMP는 열 수식을 어떻게 평가하나요?아, 맞아요, 이거요.
따라서 영향을 받는 것은 << set each value() 뿐만 아니라 formula() 도 영향을 받을 수 있습니다.
어제 당신의 글을 찾을 수 없어서 정말 다행이었습니다.
... 그것을 읽은 후에 감히 각 값을 설정 하지는 않았을 겁니다.
아마도: 해결책이 아닌 교차 검증을 위한 방안으로.
흥미로운 점은 제 경우에는 col 통계가 사용되지 않는다는 것입니다( col rank() 처럼요).
어쩌면 JMP가 해당 코드가 하나를 생성하도록 의도되었다는 걸 알고 있을지도 몰라요 ; )