Dividir uma coluna de dados em grupos automáticos com base em intervalos de valores

1

Eu tenho uma coluna que contém os dados de saída final que eu estou interessado em processar, os dados nesta coluna dão resultados que se enquadram em grupos que são muito próximos em valor. Depois de classificá-los em ordem crescente, eles aparecem como o exemplo abaixo:

Values
  1.1
  1.0
  1.3
  3.3
  3.1
  3.5
  8.7
  8.8
  8.8

A discrepância no valor depende do cálculo, mas eles geralmente são bem próximos. Existe uma maneira de dividir essa coluna automaticamente em uma matriz como a abaixo?

Value 1   Value 2   Value 3
  1.1       3.3       8.7
  1.0       3.1       8.8
  1.3       3.5       8.8

O número de resultados que caem em cada "grupo" não é previsível, mas a diferença mínima entre grupos é.

existe uma função que pode ajudar?

Dados realistas classificados em grupos após o uso da macro:

3.314496   4.707067   5.765178   6.659030   7.449414   8.155307   9.981672   10.527740
3.315203   4.709271   5.765736   6.660503   7.449503   8.157916   9.981750   10.528012
3.315863   4.710029   5.766142   6.660533   7.449609   8.157919   9.982425   10.529845
3.315932   4.710119   5.766472   6.660641   7.449958   8.159919   9.982623   10.531364
3.316198   4.710421   5.766765   6.660654   7.451202   8.160223   9.984346   10.531996
3.316321   4.712422   5.766781   6.661423   7.451525   8.808907   9.984503   10.532077
3.316874              5.767053   6.662583   7.452031   8.809137   9.985143   10.532135
3.317010              5.767273   6.663421   7.452424   8.809198   9.986184   10.532675
3.317121              5.767418   6.663555   7.452803   8.810217   9.986405   10.532898
3.317911              5.767530              7.452806   8.810217   9.986435   10.533993
3.318345              5.767669              7.453056   8.810876   9.986791   10.535355
3.319082              5.768146              7.453588   8.811238   9.986828   10.535844
                      5.768337              7.453770   8.811370   9.986854   
                      5.768448              7.453845   8.811435   9.987180   
                      5.768824              7.453880   8.811577   9.987482   
                      5.768931              7.453912   8.812060   9.987610   
                      5.768971              7.453966   8.812245   9.987809   
                      5.769521              7.453979   8.812363   9.987816   
                      5.769725              7.454064   8.812508   9.987951   
                      5.769920              7.454538   8.812781   9.988456   
                      5.770123              7.455970   8.813038   9.990445   
                      5.770187              7.456215   8.813130   9.990558   
                      5.771034              7.456421   8.813236   9.990600   
                      5.771230              7.456464   8.813414   9.991091   
                                                       8.814133      
                                                       8.814462      
                                                       8.814524      
                                                       8.814553      
                                                       8.815093      
    
por Fiztban 18.05.2014 / 17:50

1 resposta

2

EDITAR

Com base nos seus comentários, isso é o que você está procurando, pois você pode definir o limite (a diferença entre dois números que cria um novo 'grupo')

Sub Button1_Click()

Dim threshold As Double
threshold = 0.4    ' UPDATE THIS AS YOU SEE FIT

Dim column As Integer
column = 66 ' assumes the next column is B. 65 = A, 66=B, 67= C etc

Dim aRow As Integer
aRow = 1 ' The starting row where the data is

Dim otherRow As Integer
otherRow = aRow

Dim previousCol As Integer
previousCol = 64


Do While (True)

    If (column = 90) Then
        previousCol = previousCol + 1
        column = 65
    End If


    If (Range("A" & aRow).Value = "") Then
        Exit Do
    End If

    If (aRow <> 1) Then

        If Range("A" & aRow).Value - Range("A" & aRow - 1).Value >= threshold Then

            otherRow = 1
            column = column + 1

        End If

    End If


    If (previousCol < 65) Then
        Range(Chr(column) & otherRow).Value = Range("A" & aRow).Value
    Else
        Range(Chr(previousCol) & Chr(column) & otherRow).Value = Range("A" & aRow).Value
    End If

    aRow = aRow + 1
    otherRow = otherRow + 1

Loop

End Sub

A única diferença agora é que você pode definir o limite no código (veja acima), mas ele não remove mais os valores originais da coluna A (veja a captura de tela abaixo). Você pode remover isso manualmente, eu acho.

O acima também é limitado à coluna ZZ, que oferece cerca de 700 colunas

Respostaanteriorparahistórico:

Estamacrofazoquevocêquer

SubButton1_Click()DimcolumnAsIntegercolumn=66DimaRowAsIntegeraRow=1DimotherRowAsIntegerotherRow=1DimcurrentAsIntegercurrent=-99DoWhile(True)If(Range("A" & aRow).Value = "") Then
        Exit Do
    End If

    If (current < 0) Then
        current = Split(Range("A" & aRow), ".")(0)
    End If

    If (Split(Range("A" & aRow), ".")(0) <> current) Then
        current = Split(Range("A" & aRow), ".")(0)
        otherRow = 1
        column = column + 1
    End If

    Range(Chr(column) & otherRow).Value = Range("A" & aRow).Value
    Range("A" & aRow).Value = "" 'Clear A column

    otherRow = otherRow + 1
    aRow = aRow + 1

Loop

End Sub

Antes

Depois

Então, as coisas para observar sobre isso são:

  1. Ele assumiu que a coluna A tem todo o conteúdo e que haverá células vazias (a célula vazia indicará o final da lista)
  2. Divide no decimal (.). Se nenhum decimal estiver presente, ele será tratado como N.0
  3. A coluna A se torna uma coluna vazia, mas suponho que não seja difícil excluir a coluna depois ... Ou, de acordo com o código, você pode comentar a linha Range("A" & aRow).Value = "" 'Clear A column , que manterá a coluna A como
  4. No exemplo dado, você tem 3 entradas por grupo de números (3 iniciaram com 1.N, 3 iniciaram com 3.N e 3 iniciaram com 8.N). Isso não precisa ser em grupos de 3
  5. Ele assume que sua lista já está classificada
por 19.05.2014 / 13:50