【发布时间】:2018-12-16 11:21:57
【问题描述】:
任何简单的 Excel 公式都可以计算频率表中数据的平均值(众数、标准差、...),如下所示:
value frequency
5 3
8 5
4 11
.... ....
谢谢
【问题讨论】:
-
谢谢 Jeeped,我知道,但这不适用于频率表
任何简单的 Excel 公式都可以计算频率表中数据的平均值(众数、标准差、...),如下所示:
value frequency
5 3
8 5
4 11
.... ....
谢谢
【问题讨论】:
因此遵循与@Gary 的学生相似的模式,(样本)方差 Var1 是
=(SUMPRODUCT(A2:A4^2*B2:B4)-SUMPRODUCT(A2:A4*B2:B4)^2/SUM(B2:B4))/(SUM(B2:B4)-1)
(样本)标准差 SD1 是它的平方根。
使用方差和 SD 的替代公式:
再次借用另一个答案@jblood94,您可以得到方差 Var2 和标准差 SD2
=VAR.S(IF(TRANSPOSE(ROW(INDEX(A1:INDEX(A:A,MAX(B2:B4)),0)))<=B2:B4,A2:A4,""))
=STDEV.S(IF(TRANSPOSE(ROW(INDEX(A1:INDEX(A:A,MAX(B2:B4)),0)))<=B2:B4,A2:A4,""))
等等
显然,因为这会生成一个二维数组(示例数据为 3 行 11 列),它可能需要比 VBA 解决方案更多的存储空间。
【讨论】:
为了使用本机统计工作表函数,您必须将频率表扩展为一个数字数组。虽然 google 电子表格有 textjoin 和 split 函数来创建数组,但 excel 没有这样的原生功能。
使用用户定义函数将频率表扩展为元素数组。
Function freqArray(rngV As Range, rngF As Range, _
Optional bSorted As Long = 0)
'usage: =freqArray(<value_range>, <frequency_range>, <-1 descending; 0 no sort (default); 1 ascending>
Set rngV = Intersect(rngV, rngV.Parent.UsedRange)
Set rngF = rngF.Cells(1).Resize(rngV.Rows.Count, rngV.Columns.Count)
Dim i As Long, j As Long, k As Long
ReDim fa(1 To rngV.Rows.Count * Application.Sum(rngF))
For i = 1 To rngV.Cells.Count
For j = 1 To rngF.Cells(i).Value
k = k + 1
fa(k) = rngV.Cells(i)
Next j
Next i
If bSorted Then
Dim tmp As Variant, bDescending As Boolean
bDescending = CBool(bSorted < 0)
For i = LBound(fa) To UBound(fa) - 1
For j = i + 1 To UBound(fa)
If CBool(fa(i) < fa(j) And bDescending) Xor _
CBool(fa(i) > fa(j) And Not bDescending) Then
tmp = fa(j): fa(j) = fa(i): fa(i) = tmp
End If
Next j
Next i
End If
freqArray = fa
End Function
【讨论】: