Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在PowerShell中查找数据集的统计模式_Powershell_Statistics - Fatal编程技术网

在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。。。而
循环。