명목 데이터의 알파벳 순위입력이 두 번 이상 발생할 수 있는 명목 데이터 열이 있는 경우, 입력의 알파벳 순위를 출력으로 하는 열을 만드는 방법이 있습니까? 스크립팅 경로를 사용할 수 있지만 간단한 열 공식을 선호합니다.
자동화 및 스크립팅기본 데이터 분석 및 모델링Re: 명목 데이터의 알파벳 순위시간이 너무 늦어서 제 솔루션이 최고는 아닐 수도 있지만 Big Class 데이터 테이블을 사용하면 다음과 같은 공식을 생각해 낼 수 있습니다.
As Constant( Summarize( theLevels = by( :age ) ) );
Contains( theLevels, Char( :age ) );

Re: 명목 데이터의 알파벳 순위Add dense ranking to Ranking Tie와 Col Rank 함수를 얻을 때까지 txnelson이 간단한 경우에 보여준 것과 같은 것을 사용할 것입니다. Col 통계 함수를 사용하는 모든 종류의 솔루션이 있지만 여러 개를 결합하고 서로 내부에서 결합해야 하기 때문에 이해하기 매우 어려운 경향이 있습니다(해당 위시리스트 항목의 댓글에서 몇 가지를 찾을 수 있습니다).
Re: 명목 데이터의 알파벳 순위반면에 -
이렇게 똑똑한 해결책이 나오기까지는 밀도 높은 순위가 구현되기까지 시간이 좀 걸릴 것 같아요.
고맙습니다, 짐!!
Re: 명목 데이터의 알파벳 순위
dt = Open( "$SAMPLE_DATA/Big Class Families.jmp" );
for(i=1, i<16, i++, dt<< Concatenate(dt,append to first table()));
wait(0);
show(nrows(dt));
Print("std rank");
t0 = hptime();
New Column( "std Rank",
Formula(
Col Rank( :height)
)
);
dt << run formulas();
show((hptime()-t0)/1000000);
Print("row_min rank median");
t0 = hptime();
New Column( "dense_Rank_ref1",
Formula(
Col Median(
Col Rank( If( Row() == Col Minimum( Row(), :height ), :height, . ) ),
:height
)
)
);
dt << run formulas();
show((hptime()-t0)/1000000);
print("summarize_contains");
t0 = hptime();
New Column( "dense rank_summarize_contains",
Formula(
As Constant( Summarize( theLevels = by( :height ) ) );
Contains( theLevels, Char( :height ) );
)
);
dt << run formulas();
show((hptime()-t0)/1000000);
print("row_min cumulative sum");
t0 = hptime();
print("- just works after sorting");
dt << Sort( By( :height ), Replace Table);
New Column( "dense_Rank_ref1",
Formula(
Col Cumulative Sum(If(Row() == Col Min(Row(), :height), 1,0))
)
);
dt << run formulas();
show((hptime()-t0)/1000000);
close(dt, nosave);Re: 명목 데이터의 알파벳 순위factor 2가 더 빠름: 요약 표를 통한 우회:

dt = Open( "$SAMPLE_DATA/Big Class Families.jmp" );
for(i=1, i<16, i++, dt<< Concatenate(dt,append to first table()));
t0 = hptime();
dtsum = dt << Summary( Group( :height ),private);
dtsum << New Formula Column(
Operation( Category( "Distributional" ), "Rank" ),
Columns( :height )
);
dtsum << run formulas();
dt << Update(
With(dtsum),
Match Columns( :height = :height ),
Add Columns from Update Table( :"Rank[height]"n ),
Replace Columns in Main Table( None )
);
show((hptime() - t0)/1000000)
이 접근 방식은 그룹화(groupBy)를 통해 하위 집합에 대한 밀도 순위를 계산하는 데 쉽게 확장될 수 있습니다.
Re: 명목 데이터의 알파벳 순위Summarize를 사용하는 대신 요약 표를 만들면 @txnelson 접근 방식을 사용하여 하위 집합에 대한 밀집 순위를 계산할 수 있습니다.
단점: 꽤 느리다

더 보기...names default to here(1);
Try(close(dt,nosave));
dt = Open( "$SAMPLE_DATA/Big Class Families.jmp" );
for(i=1, i<16, i++, dt<< Concatenate(dt,append to first table()));
t0 = hptime();
//dense rank - with groupby
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
)));
show((hptime() - t0)/1000000)
Re: 명목 데이터의 알파벳 순위모든 것을 As Constant 에 넣고 주요 부분이 시작되기 전에 "공식"을 멈추는 것이 좋습니다.
... 정말 빠르죠.
... 작은 GUI의 도움으로 매우 유연합니다.

... 그리고 영원히 잠들 수 있는 메인 명령을 통해서: 심지어 동적으로 : )
Names Default To Here( 1 );
Try(
dt = Current Data Table(),
Caption( "no dat table" );
Stop();
);
updateLBox = Function( {t},
(t << sib) << setitems( (t << topparent)[listboxbox( 1 )] << getselected )
);
nw = New Window( "rank unique entries",
<<TYPE></TYPE><EM>워크플로\빌딩블록\열작업\RankUnique_with_ByGroup.jmpflow</EM>
Re: 명목 데이터의 알파벳 순위될 것이다
이건 정말 영리하네요. Ctrl 버튼을 누르고 있으면 By Group에 여러 값을 입력할 수 있지만 입력 개수에 대한 마지막 항목에만 작동합니다. 제가 뭔가 잘못하고 있는 건가요?