如何使用AWK计算一列数值数据的中位数?
我可以想到一个简单的算法,但我似乎无法编程:
到目前为止我所拥有的是:
sort | awk 'END{print NR}'
Run Code Online (Sandbox Code Playgroud)
这给了我列中元素的数量.我想用它来打印某一行(NR/2).如果NR/2不是整数,那么我向上舍入到最接近的整数,这是中位数,否则我取平均值(NR/2)+1和(NR/2)-1.
std::set是一个排序树.它提供begin和end方法,所以我可以得到最小和最大,lower_bound并upper_bound用于二进制搜索.但是如果我想让迭代器指向中间元素(或者其中一个元素,如果有偶数个元素)怎么办?
有没有一种有效的方法(O(log(size))不O(size))这样做?
{1} => 1
{1,2} => 1 or 2
{1,2,3} => 2
{1,2,3,4} => 2 or 3 (but in the same direction from middle as for {1,2})
{1,312,10000,14000,152333} => 10000
Run Code Online (Sandbox Code Playgroud)
PS:俄语同样的问题.
我正在尝试计算图表的条件中位数,如下所示:
A | B
-------
x | 1
x | 1
x | 3
x |
y | 4
z | 5
Run Code Online (Sandbox Code Playgroud)
我正在使用MS Excel 2007.我知道AVERAGEIF()语句,但没有相应的中位数.主要技巧是有没有数据的行 - 例如上面的第4个"a".在这种情况下,我不希望在计算中考虑这一行.
谷歌搜索建议如下,但Excel不接受公式格式(也许是因为它是2007年?)
=MEDIAN(IF((A:A="x")*(A:A<>"")), B:B)
Run Code Online (Sandbox Code Playgroud)
Excel给出一个错误,说我的公式有问题(与条件中的*有关)我也尝试过以下方法,但它在计算中将空白单元格计为0:
=MEDIAN(IF(A:A = "x", B:B, "")
Run Code Online (Sandbox Code Playgroud)
我知道那些公式返回Excel"数组",这意味着必须输入"Ctrl-shift-enter"才能使其正常工作.
如何进行条件评估而不考虑空白单元格?
我正在寻找一个5元素排序的排序网络实现,但由于我在SO上找不到一个好的参考,我想要求为所有小的n值排序网络,至少n = 3通过n = 6但更高的值也会很好.一个好的答案至少应该将它们列为"交换"(对2个元素进行排序)操作的序列,但是在低阶排序网络方面看到递归分解也可能会很好.
对于我的应用程序,我实际上只关心5个元素的中位数,而不是实际按顺序排列.也就是说,只要中位数在正确的位置结束,结果中可能未指定其他4个元素的顺序.可以使用与排序网络相关的方法来计算交换数量少于执行完整排序的中位数吗?如果是这样,我的问题(对于n = 5)和其他情况的这种解决方案也会得到一个很好的答案.
(注意:我已经标记了这个问题C,因为C是我使用的语言,我怀疑跟随C标签的人有很好的答案,但我真的不在乎答案实际上是用C编写而不是伪代码只要符合上述标准,它就可以很容易地转换成C语言.)
我想覆盖C#中的List对象,以便添加像Sum或Average这样的Median方法.我已经找到了这个功能:
public static decimal GetMedian(int[] array)
{
int[] tempArray = array;
int count = tempArray.Length;
Array.Sort(tempArray);
decimal medianValue = 0;
if (count % 2 == 0)
{
// count is even, need to get the middle two elements, add them together, then divide by 2
int middleElement1 = tempArray[(count / 2) - 1];
int middleElement2 = tempArray[(count / 2)];
medianValue = (middleElement1 + middleElement2) / 2;
}
else
{
// count is odd, simply get the middle element.
medianValue = …Run Code Online (Sandbox Code Playgroud) 下面是我用两个numpy数组构建的散点图.
散点图示例

我想在这个图中添加的是y在x范围内的运行中位数.我在一个例子中拍照:
修改的散点图

具体来说,我需要两个值之间x轴上1个单位的数据点的中位数(这个范围会在很多图之间变化,但我可以手动调整它).我感谢任何可以指向正确方向的提示.
vector<T> vec{...}假设T是一种数值类型,给定一种提取其最小值,最大值和中位数的最佳方法是什么?我知道的std::nth_element还有std::minmax_element,但他们似乎做多余的工作,如果叫了一个又一个。
到目前为止,我想到的最好的主意是一次叫std :: nth_element 3次。但这仍然需要3N比较,对吗?有什么方法可以重用先前迭代中完成的部分排序吗?
我可以使用中位数选择算法的中位数来找出O(n)中的中位数.此外,我知道在算法完成后,中位数左边的所有元素都小于中位数,右边的所有元素都大于中位数.但是如何在O(n)时间内找到k个最近邻居的中位数呢?
如果中位数是n,则左边的数字小于n,右边的数字大于n.但是,数组未在左侧或右侧排序.数字是用户给出的任何一组不同的数字.
问题来自Cormen的算法导论,问题9.3-7
我需要在电子表格中返回仅某个类别的中位数.以下示例
Airline 5
Auto 20
Auto 3
Bike 12
Airline 12
Airline 39
Run Code Online (Sandbox Code Playgroud)
等.
如何编写公式只返回航空公司类别的中位数值.与平均值相似,仅适用于中位数.我无法重新安排价值观.谢谢!
关于此答案,是否存在一种快速方法来计算具有不等数量元素的组的数组的中值?
例如:
data = [1.00, 1.05, 1.30, 1.20, 1.06, 1.54, 1.33, 1.87, 1.67, ... ]
index = [0, 0, 1, 1, 1, 1, 2, 3, 3, ... ]
Run Code Online (Sandbox Code Playgroud)
然后,我想计算数量和每组中位数之间的差(例如,组的中位数0为1.025,则第一个结果为1.00 - 1.025 = -0.025)。因此,对于上面的数组,结果将显示为:
result = [-0.025, 0.025, 0.05, -0.05, -0.19, 0.29, 0.00, 0.10, -0.10, ...]
Run Code Online (Sandbox Code Playgroud)
既然np.median.reduceat还不存在,还有另一种快速的方法来实现这一目标吗?我的数组将包含数百万行,因此速度至关重要!
可以假定索引是连续且有序的(如果不是,则很容易对其进行转换)。
import numpy as np
np.random.seed(0)
rows = 10000
cols = 500
ngroup = 100
# Create random data and groups …Run Code Online (Sandbox Code Playgroud)