【问题标题】:Excel formulas for frequency tables频率表的 Excel 公式
【发布时间】:2018-12-16 11:21:57
【问题描述】:

任何简单的 Excel 公式都可以计算频率表中数据的平均值(众数、标准差、...),如下所示:

value    frequency
5         3
8         5
4         11
....      ....

谢谢

【问题讨论】:

  • 谢谢 Jeeped,我知道,但这不适用于频率表

标签: excel frequency


【解决方案1】:

平均:

=SUMPRODUCT(A2:A4*B2:B4)/SUM(B2:B4)

【讨论】:

    【解决方案2】:

    您可以通过以下方式使用 Excel 的原生统计功能(您必须使用 ctrl+shift+enter 提交):

    IF(Table1[frequency]>=TRANSPOSE(ROW(INDIRECT("1:"&MAX(Table1[frequency])))),Table1[value])
    

    【讨论】:

    • 我认为这只有在表中的行数>=最大频率时才有效,即它没有给出来自 OP 的前 3 行的正确结果。
    • 感谢@TomSharpe!当我在脑海中写下公式时,我的公式中有一个MAX,然后我不记得为什么写下来了。我已经更新了答案。
    【解决方案3】:

    因此遵循与@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 解决方案更多的存储空间。

    【讨论】:

      【解决方案4】:

      为了使用本机统计工作表函数,您必须将频率表扩展为一个数字数组。虽然 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
      

      【讨论】:

      • 非常好的方法
      • 其实我所有的只是零零碎碎的东西。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-23
      • 2018-04-09
      • 2018-03-18
      • 1970-01-01
      • 1970-01-01
      • 2020-07-24
      相关资源
      最近更新 更多