名义数据的字母排序如果我有一列名义数据,其中的输入可以出现多次,那么有没有办法让一列的输出是输入的字母顺序?我可以使用脚本,但我更喜欢简单的列公式。
自动化和脚本基础数据分析与建模回复:名义数据的字母排序现在已经很晚了,所以我的解决方案可能不是最好的,但是使用大类数据表,这是我得出的公式
As Constant( Summarize( theLevels = by( :age ) ) );
Contains( theLevels, Char( :age ) );

回复:名义数据的字母排序在我们获得将密集排名添加到 Ranking Tie 和 Col Rank 函数之前,我会使用类似 txnelson 在简单情况下展示的方法。使用 Col 统计函数有各种各样的解决方案,但它们往往很难理解,因为您必须将它们中的多个组合在一起并将它们相互组合(您可以从该愿望清单项的评论中找到一些)。
回复:名义数据的字母排序另一方面 -
尽管有如此聪明的解决方法,但我担心密集排名的实施还需要一些时间。
谢谢吉姆!!
回复:名义数据的字母排序
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);回复:名义数据的字母排序速度快 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)的密集排名。
回复:名义数据的字母排序当您创建汇总表而不是使用 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)
回复:名义数据的字母排序最好将所有内容放入“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>工作流\BuildingBlocks\ColumnOperations\RankUnique_with_ByGroup.jmpflow</EM>
回复:名义数据的字母排序将
这个真的很聪明。如果我按住 Ctrl 按钮,我可以在按组输入多个值,但它只对输入数量的最后一个条目进行操作。我做错了什么吗?