在PowerShell中查找数据集的统计模式
这个自我回答的问题是以下问题的后续: 如何确定给定数据集(数组),即最频繁出现的一个值或一组值在PowerShell中查找数据集的统计模式,powershell,statistics,Powershell,Statistics,这个自我回答的问题是以下问题的后续: 如何确定给定数据集(数组),即最频繁出现的一个值或一组值 例如,在数组1,2,2,3,4,4,5中有两种模式,2和4,因为它们是最频繁出现的值。使用组对象、排序对象和do>的组合。。。而循环: #示例数据集。 $dataset=1,2,2,3,4,4,5 #将相同的数字分组,并按成员计数对组进行排序,首先是最高计数。 $groups=$dataset |组对象|排序对象计数-递减 #仅输出由具有 #最高成员数。 $i=0 do{$groups[$i].Gro
例如,在数组
1,2,2,3,4,4,5
中有两种模式,2
和4
,因为它们是最频繁出现的值。使用组对象
、排序对象
和do>的组合。。。而
循环:
#示例数据集。
$dataset=1,2,2,3,4,4,5
#将相同的数字分组,并按成员计数对组进行排序,首先是最高计数。
$groups=$dataset |组对象|排序对象计数-递减
#仅输出由具有
#最高成员数。
$i=0
do{$groups[$i].Group[0]}而($groups[+$i].Count-eq$groups[0].Count)
上述结果产生了2
和4
,这是两种模式(最常出现的值,在这种情况下各两次),按升序排序(因为组对象
按分组标准排序,排序对象
的排序算法是稳定的)
注意:虽然这个解决方案在概念上很简单,但是大数据集的性能可能是一个问题;有关某些输入可能的优化,请参阅底部部分
说明:
- 将所有输入按相等方式分组
- 按成员计数以降序方式对结果组进行排序(首先是最频繁出现的输入)
语句在已排序的组上循环,并输出由每个组表示的输入,只要组成员存在,因此出现计数(频率)最高,如第一个组的成员计数所示do。。。while
性能更好的解决方案,包括字符串和数字: 如果输入元素是统一的简单数字或字符串(与复杂对象相反),则可以进行优化:
组对象的
禁止收集每个组中的单个输入-NoElement
- 每个组的
属性反映分组值,但作为字符串反映分组值,因此必须将其转换回其原始数据类型.Name
#示例数据集。
#必须由所有数字或字符串组成。
$dataset=1,2,2,3,4,4,5
#通过数据集的第一个元素确定数据集元素的数据类型。
#假设所有元素都是同一类型。
$type=$dataset[0]。GetType()
#将相同的数字分组,并按成员计数对组进行排序,首先是最高计数。
$groups=$dataset |组对象-NoElement |排序对象计数-降序
#仅输出由具有
#最高成员数。
#-as$type将.Name字符串值转换回原始类型。
$i=0
do{$groups[$i].Name-as$type}而($groups[+$i].Count-eq$groups[0].Count)
我可能错了(并欢迎更正),但如果您只是使用where子句退出模式,这难道不能简单得多吗$sorted=$dataset | group object | sort object-property count-descending,然后($sorted |?{$$.count-eq$sorted[0].count})。NameThank,@Ryan-确实有改进的潜力:我最初的想法是,一条管道可以避免收集内存中的所有对象,但这种逻辑是错误的,因为分组和排序都需要这样做。因此,两步方法是可行的,并且在概念上更简单。然而,一个Where Object
解决方案总是迭代所有组,这应该避免-请参阅我的更新,它现在使用do。。。而
循环。