问题
问题 1:我需要获取数据表列中唯一值的列表。
问题 2:我需要获取 JSL 数据结构(列表或矩阵)中唯一值的列表
解决方案
对于问题1:
解决方案一:使用汇总表。下面的 JSL 显示了如何使用 Summary() 来获取一个表,该表的一行中的每个唯一值都位于单个列中。然后,您可以执行进一步的 JSL 表命令以从汇总表中获取这些值。
_dt = Open( "$sample_data/big class.jmp" );
//create a summary table of the :sex column
_dt1 = _dt << Summary(
Group( :sex ),
Freq( "None" ),
Weight( "None" )
);
//create a summary table of the :age column
_dt2 = _dt << Summary(
Group( :age ),
Freq( "None" ),
Weight( "None" )
);
<SPAN class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="2-13-2018 5-22-08 PM.png" style="width: 280px;"><SPAN class="lia-inline-image-display-wrapper" image-alt="2-13-2018 5-22-08 PM.png" style="width: 280px;"><span class="lia-inline-image-display-wrapper" image-alt="2-13-2018 5-22-08 PM.png" style="width: 280px;"><img src="https://us.v-cdn.net/6038925/uploads/images/9328i5A075F342798D202/2-13-2018%205-22-08%20PM.png" role="button" title="2-13-2018 5-22-08 PM.png" alt="2-13-2018 5-22-08 PM.png" /></span></SPAN></SPAN>
问题2:
现在,您拥有 JMP 列表或矩阵,而不是数据表:
sexlist = {"F", "M", "M", "F", "F", "M", "M", "F", "M"};
agelist = [14, 11, 12, 13, 15, 17, 15, 11, 12];执行此操作的复杂方法是:
a) 将列表中的值放入新的数据表列中,然后使用汇总方法,或者
b) 编写一个稍微复杂的 for 循环来搜索并记录唯一值
幸运的是,有一种更简单的方法,即使用关联数组。
Associative Array(sexlist) << Get Keys;
Associative Array(agelist) << Get Keys;
分别返回 {"F", "M"} 和 {11, 12, 13, 14, 15, 17}(请注意,这些是很好的排序列表!)。如果您希望数值作为排序向量,您可以使用
Matrix(Associative Array(agelist) << Get Keys);
返回 [11, 12, 13, 14, 15, 17]。
此方法也可以用来代替问题 1 的解决方案 1:
问题1,解决方案2:Associative Array(Column(_dt, "sex") << Get Values) << Get Keys;<BR />Matrix(Associative Array(Column(_dt, "age")<< Get Values)<<GET keys=""></GET>
回报分别为{“F”、“M”}和[11、12、13、14、15、17]。 这是在做什么
- 从指定列获取值作为列表(如果列是字符)或矩阵(如果列是数字)
- 将该列表或矩阵转换为关联数组
- 获取关联数组的键,在本例中是列中值的唯一级别,并将其作为列表返回
- (如果在结果列表上使用 Matrix(),则仅当列表中的值都是数字时才有效)。
Summarize() 比关联数组高效得多,对于 200 万行数据(1 秒与 8 秒延时),这一点非常明显。 如果性能至关重要,请尽可能使用 Summarize()。
Summarize( dt, smrz1 = by( : 性别 ) ); Summarize( dt, smrz2 = by( :age ) );
* Summarize() 不会创建中间数据表 << Summary
关联数组的优点在于它节省了将列表/矩阵放入数据表的工作,这是小数据量的完美解决方案。