如何分隔列表中的匹配值你好,
我有一个可能包含以下内容的列表,例如:{22、22、22、33、33}。 我希望能够获得列表中每个唯一值的数量,例如 22 的数量和 33 的数量。 问题是,我不知道我的列表会有多长以及列表中会有多少个唯一数字。 JSL 中是否有任何方法可以为此通用解决方案?
谢谢
脚本回复:如何分隔列表中的匹配值我相信您的最后一次编辑需要将“my_bigger_list”更改为“my_list”
回复:如何分隔列表中的匹配值你好,
不用担心,我解决了问题,您的解决方案不是问题的一部分。 谢谢。
回复:如何分隔列表中的匹配值@pmroz的回答引起了我的兴趣。因为如果可以的话,我通常会尽量避免使用数据表,因为开销。我玩计时
names default to here(1);
my_list = {44, 33, 22, 33, 44};
repeat_list = [1, 5, 10, 50, 100, 1000, 2500, 5000, 7500, 10000];
dt_timing = new table("Timings",
new column("List Size"),
new column("Design"),
new column("Loop"),
new column("Summarize"),
);
for(ii=1, ii<=20, ii++,
for(ir = 1, ir <= nitems(repeat_list), ir++,
my_bigger_list = repeat(my_list, repeat_list[ir]);
// using design
st = HPTime();
aa = associative array(my_bigger_list);
keys = aa << Get Keys;
d = design(my_bigger_list, keys);
aa_design = associative array(keys, VSum(d));
time_design = HPTime() - st;
//using a loop
st = HPTime();
aa_loop = associative array(my_bigger_list, repeat(0, nitems(my_bigger_list)));
for(i=1, i<=nitems(my_bigger_list), i++,
aa_loop[my_bigger_list[i]]++;
);
time_loop = HPTime() - st;
//using a data table
st = HPTime();
dt = New Table( "Untitled", invisible, Add Rows( nitems(my_bigger_list) ),
New Column( "Column 1", Numeric, "Continuous", Format( "Best", 12 ),
Set Values( my_bigger_list )
)
);
summarize(dt, unique_value_list = by(:column1), unique_count = count(:column 1) );
close(dt, nosave);
aa_peter = associative array(unique_value_list, unique_count);
time_peter = HPTime()-st;
Eval(EvalExpr(
dt_timing << Add Rows({List Size = Expr(Nitems(my_bigger_list)), Design = Expr(time_design), Loop = Expr(time_loop), Summarize = Expr(time_peter)});
));
);
);
dt_stack = dt_timing << Stack(
columns( :Design, :Loop, :Summarize ),
Source Label Column( "Method" ),
Stacked Data Column( "Timing" )
);
close(dt_timing, no save);
biv = dt_stack << Bivariate(
Y( :Timing ),
X( :List Size ),
group by(:Method),
fit line(),
SendToReport(
Dispatch(
{},
"Bivar Plot",
FrameBox,
{Row Legend(
Method,
)}
),
)
);
显然这取决于列表的大小。但是我在不同的列表大小上分别运行了 20 次并得到了这个

设计是我能找到的最快的方法。我绝对同意@txnelson我不喜欢 Summarize 因为它总是返回字符。
回复:如何分隔列表中的匹配值我是设计的忠实粉丝。
names default to here(1);
l = {22, 22, 22, 33, 33};
l = sort ascending(l);
d = VSuM(design(l));
csum = cumulative sum(d);
lvalues = l[csum];
aa = associative array(lvalues, d);
*编辑*我意识到排序需要很多时间,所以这要快得多
names default to here(1);
my_list = {44, 33, 22, 33, 44};
aa = associative array(my_list );
keys = aa << Get Keys;
d = design(my_list , keys);
aa_design = associative array(keys, VSum(d));
*再次编辑(不知道为什么这让我如此困扰)*我不喜欢关联数组,这仍然更快
names default to here(1);
my_list = {44, 33, 22, 33, 44};
d = design(my_bigger_list, <<LEVELS></LEVELS>回复:如何分隔列表中的匹配值如果您要遍历文件中的列,为什么不直接使用 Tabulate 或 Summary 命令呢?如果您按另一列对事物进行分组,则可以将其用作“按”变量。例如:
| ID |
价值 |
| 一个 |
1 |
| 一个 |
2 |
| 一个 |
2 |
| 乙 |
2 |
| 乙 |
3 |
| 乙 |
3 |
| 乙 |
4 |
| 乙 |
4 |
使用表格将 ID 和值列拖到行的放置区域上。您需要将 Value 的角色更改为分组变量。这是结果:
| ID |
价值 |
ñ |
| 一个 |
1 |
1 |
| 一个 |
2 |
2 |
| 乙 |
2 |
1 |
| 乙 |
3 |
2 |
| 乙 |
4 |
2 |
因此,对于 A,您有两个不同的值 (1, 2),以及出现次数 (1, 2)。对于 B,您有三个不同的值(2、3、4)以及出现次数(1、2、2)。
这是等效的 JSL:
dt = New Table( "Test", Add Rows( 8 ),
New Column( "ID", Character, "Nominal",
Set Values( {"A", "A", "A", "B", "B", "B", "B", "B"} ) ),
New Column( "Value", Numeric, "Continuous", Format( "Best", 12 ),
Set Values( [1, 2, 2, 2, 3, 3, 4, 4] ) )
);
dtab = dt << Tabulate(
Show Control Panel( 0 ),
Add Table( Row Table( Grouping Columns( :ID, :Value ) ) ),
invisible
);
dt2 = dtab << Make Into Data Table;回复:如何分隔列表中的匹配值你能发布一些数据和代码吗?
回复:如何分隔列表中的匹配值你好@pmroz ,
我尝试了您发布的第一个解决方案,它适用于一个文件/列表。 但是,当我将您的代码用作函数并循环遍历它时(尽管已经初始化了所有变量以确保没有存储上一次迭代中的任何内容),它似乎不起作用。 我正在引用一个文件,因为我遍历文件中的一列以获取正在使用的列表。 当我确保初始化所有列表和变量时,关于发生了什么的任何想法?
回复:如何分隔列表中的匹配值@贾兹,
这是另一种方法,使用 Loc()。
MyList = {22,33,22,22,22,33,33,44,44,44,33,22};
AA = Associative Array(MyList);
UniqueVals = AA << Get Keys;
Frequency = {};
for(i = 1, i <= N Items(UniqueVals),i++,
Insert Into(Frequency,N Rows(Loc(MyList,UniqueVals[i])));
);
Show(Frequency);
回复:如何分隔列表中的匹配值请将此建议发布在社区的愿望清单区域。
回复:如何分隔列表中的匹配值我对汇总平台的支持是,分组变量在汇总数据表中保持为与原始数据表中相同的数据类型。在 Summarize() 函数中,它始终作为字符值返回,即使指定的 By 列是数字。
回复:如何分隔列表中的匹配值我同意@pmroz和@txnelson ,数据表使这很容易。
我更喜欢总结()功能结束制表和概括不过为此。
my_list = {22, 22, 22, 33, 33};
dt = New Table( "Untitled",
private,
Add Rows( N Items( my_list ) ),
New Column( "Column 1",
Numeric,
"Continuous",
Format( "Best", 12 ),
Set Values( my_list )
)
);
summarize(dt, group=by(:column 1), n=count(:column 1));
show(group, n);
回复:如何分隔列表中的匹配值谢谢,
如果 JMP 为列表/关联数组包含查找匹配项/返回匹配项功能,就像它们对列和行所做的那样,这将很有用。
回复:如何分隔列表中的匹配值不要忘记总结。甚至更短。
my_list = {22, 22, 22, 33, 33};
dt = New Table( "Untitled", invisible, Add Rows( nitems(my_list) ),
New Column( "Column 1", Numeric, "Continuous", Format( "Best", 12 ),
Set Values( my_list )
)
);
summarize(dt, unique_value_list = by(:column1), unique_count = count(:column 1) );
show(unique_value_list, unique_count);
回复:如何分隔列表中的匹配值这是我的变化@pmroz解决方案。它更像是一个老派的解决方案
my_list = {22, 22, 22, 33, 33};
dt = New Table( "Untitled",
private,
Add Rows( N Items( my_list ) ),
New Column( "Column 1",
Numeric,
"Continuous",
Format( "Best", 12 ),
Set Values( my_list )
)
);
// Use the Summary Platform to create the aggragate values
dtSum = dt << Summary(
private,
Group( :Column 1 ),
Freq( "None" ),
Weight( "None" )
);
// Create the new lists
unique_value_list = As List( dtSum:column 1 << get values );
unique_count = As List( dtSum:n rows << get values );
Close( dt, nosave );
Close( dtSum, nosave );
Show( unique_value_list, unique_count );回复:如何分隔列表中的匹配值表操作可能是最快的方法。
my_list = {22, 22, 22, 33, 33};
dt = New Table( "Untitled", invisible, Add Rows( nitems(my_list) ),
New Column( "Column 1", Numeric, "Continuous", Format( "Best", 12 ),
Set Values( my_list )
)
);
dtab = dt << Tabulate(Show Control Panel( 0 ),
Add Table( Row Table( Grouping Columns( :Column 1 ) ) ));
dt2 = dtab << Make Into Data Table(invisible);
unique_value_list = dt2:column 1 << get values;
unique_count = dt2:n << get values;
close(dt, nosave);
close(dt2, nosave);
show(unique_value_list, unique_count);回复:如何分隔列表中的匹配值我已经设法使用关联数组和 << get key 功能获得像 {22, 33} 这样的唯一值列表,但我仍然不知道如何获取原始中每个唯一值的数量列表。