如何分隔列表中的匹配值你好,
我有一个列表,其中可能包含以下内容,例如:{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 次,得到了这个

设计是我能找到的最快的方法。我绝对同意@tx尼尔森我不喜欢 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>回复:如何分隔列表中的匹配值如果您要循环遍历文件中的列,为什么不直接使用制表或摘要命令呢?如果您按另一列对事物进行分组,则可以将其用作“by”变量。例如:
| ID |
价值 |
| A |
1 |
| A |
2 |
| A |
2 |
| 乙 |
2 |
| 乙 |
3 |
| 乙 |
3 |
| 乙 |
4 |
| 乙 |
4 |
使用制表将 ID 和值列拖动到行的放置区域上。您需要将 Value 的角色更改为分组变量。这是结果:
| ID |
价值 |
氮 |
| A |
1 |
1 |
| A |
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和@tx尼尔森,数据表使这变得容易。
我更喜欢总结()功能结束制表和概括不过为此。
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} 这样的唯一值的列表,但我仍然不知道如何获取原始值中每个唯一值的数量列表。