计算excel中的不同值 - 频率函数

时间:2010-07-22 18:34:00

标签: excel function frequency

计算excel中的不同值 - 频率函数 是的,我读过 Counting distinct values in excel - frequency function

我尝试计算一个具有不同数字的列

列包含(搜索)

1 3 7 9 5 1 3 9 4

结果寻找;

C1  C2
1 = 2
2 = 0
3 = 2
4 = 1 
etc

3 个答案:

答案 0 :(得分:1)

在A栏输入您的数字,在B栏输入一个序列

A   B
1   1
2   1
3   1
4   1 
2   1
3   1
4   1

选择两列并创建一个数据透视表,将col A放入行中。选择{COUNT}作为功能,您就完成了。

答案 1 :(得分:1)

您可以使用COUNTIF计算符合条件的元素数量 假设您的数字在A栏中,例如从A1到A10:

A1: 1
A2: 3
A3: 7

等...
在表格的某处输入您感兴趣的值:

B1: 0
B2: 1

等...
在C1中输入
 =COUNTIF($A$1:$A$10, B1)

这应该计算等于B1的值(即0),在A1:A10中。

答案 2 :(得分:1)

不是确切地您要问什么,但我使用宏来生成频率表。我喜欢。原始代码由MWE发布在doc here,我(希望)对其进行了一些改进。剩下了一些冗余代码,所以我得到了更多答复:p

Sub zzzFrequencyDONT_SELECT_WHOLE_COLUMN()

    ' if user selects massive range - usually whole column - stops them


    If Selection.Rows.Count > 60000 Then
    MsgBox "Range selected is way too large - over 60,000. You have probably selected an entire column. Select a range of under 60,000 cells and try again"
    End If

    If Selection.Rows.Count > 60000 Then
    Exit Sub
    End If

     '
     '       Function    computes frequency count of unique values in a selection
     '
    Dim Count() As Integer
    Dim I As Integer, J As Integer
    Dim Num As Integer, NumOK As Integer, MaxNumOK As Integer, NumBad As Integer
    Dim Row As Integer, Col As Integer, Temp1 As Integer, Temp2 As Integer
    Dim strBuffer As String, strBadVals As String
    Dim CellVal As Variant
    Dim Ans As VbMsgBoxResult

    Num = 0
    NumBad = 0
    NumOK = 0
    MaxNumOK = 50
    ReDim Count(MaxNumOK, 2)
    strBuffer = ""
     '
     '           sequence through each cell in selection
     '
    For Each Cell In Selection
        Num = Num + 1
        On Error Resume Next
        CellVal = Cell.Value
        Select Case Err
        Case Is = 0
             '
             '                   no error, examine type
             '
            Select Case LCase(TypeName(CellVal))
            Case "integer", "long", "single", "double"
                 '
                 '                           numeric type; if single or double, use
                 '                           Fix function to reduce to integer portion
                 '
                If TypeName(CellVal) = "single" Or _
                TypeName(CellVal) = "double" Then
                    CellVal = Fix(CellVal)
                End If
                 '
                 '                           check if previously seen
                 '                           if so, simply bump counter
                 '                           if not, increment NumOK and store value
                 '
                For I = 1 To NumOK
                    If CellVal = Count(I, 1) Then
                        Count(I, 2) = Count(I, 2) + 1
                        GoTo NextCell
                    End If
                Next I
                NumOK = NumOK + 1
                If NumOK > MaxNumOK Then
                    MsgBox "capacity of freq count proc exceeded" & vbCrLf & _
                    "Displaying results so far", vbCritical
                    GoTo SortCount
                End If
                Count(NumOK, 1) = CellVal
                Count(NumOK, 2) = 1
            Case Else
                NumBad = NumBad + 1
                If Cell.Text <> "" Then
                    strBadVals = strBadVals & Cell.Text & vbCrLf
                Else
                    strBadVals = strBadVals & "<blank>" & vbCrLf
                End If
            End Select
        Case Is <> 0
            NumBad = NumBad + 1
            If Cell.Text <> "" Then
                strBadVals = strBadVals & Cell.Text & vbCrLf
            Else
                strBadVals = strBadVals & "<blank>" & vbCrLf
            End If
        End Select
NextCell:
    Next Cell
     '
     '           counting done, sort data
     '
SortCount:
    For I = 1 To NumOK
        For J = I To NumOK
            If I <> J Then
                If Count(I, 1) > Count(J, 1) Then
                    Call SwapVals(Count(I, 1), Count(J, 1))
                    Call SwapVals(Count(I, 2), Count(J, 2))
                End If
            End If
        Next J
    Next I
     '
     '           store count data for display
     '

Dim percentstore As Single

percentstore = Str(Count(I, 2)) / Str(Num)

    For I = 1 To NumOK
        strBuffer = strBuffer & Str(Count(I, 1)) & vbTab + Str(Count(I, 2)) & vbTab & FormatPercent(Str(Count(I, 2)) / Str(Num)) & vbCr
    Next I
     '
     '           display results
     '
    MsgBox "CTRL C to copy" & vbCrLf & _
    "# cells examined = " & Str(Num) & vbCrLf & _
    "# cells w/o acceptable numerical value = " & NumBad & vbCrLf & _
    "# unique values found = " & NumOK & vbCrLf & _
    "Frequency Count:" & vbCrLf & "value" & vbTab & "frequency" & vbTab & "Percent" & vbCr + strBuffer, vbInformation, "Frequency count - CTRL C to copy"
    If NumBad > 0 Then
        Ans = MsgBox("display non-numerics encountered?", vbQuestion & vbYesNo)
        If Ans = vbYes Then MsgBox "Non Numerics encountered" & vbCrLf & strBadVals
    End If
     '
     '           write to worksheet?
     '
  '  Ans = MsgBox("Ok to write out results below selection?" & vbCrLf + _
  '  "results will be two cols by " & (NumOK + 1) & " rows", vbQuestion + vbYesNo)
  '  If Ans <> vbYes Then Exit Sub
  '  Row = Selection.Row + Selection.Rows.Count
  '  Col = Selection.Column
'   Cells(Row, Col) = "Value"
  '  Cells(Row, Col + 1) = "Count"
'   For I = 1 To NumOK
  '      Cells(Row + I, Col) = Count(I, 1)
'       Cells(Row + I, Col + 1) = Count(I, 2)
'   Next I

End Sub

Sub SwapVals(X, Y)
     '
     '       Function    swaps two values
     '
    Dim Temp

    Temp = X
    X = Y
    Y = Temp

End Sub