Folha de cálculo localizando e ordenando a aparência mais frequente de nomes

0

Eu tenho uma planilha parecida com a seguinte:

link

Existe uma lista de nomes na coluna A. Esses nomes aparecem uma vez em uma ordem aleatória em cada uma das seguintes colunas de C a G.

Como posso produzir um resultado como eu criei manualmente na coluna I? Gostaria de saber quais nomes apareceram mais nas Linhas 1-10 nas Colunas C a G e quais nomes tinham o melhor número médio de linhas.

Eu encontrei manualmente que "Name C6" apareceu mais, com 4 aparições. Então eu encontrei mais quatro nomes que tiveram três Top 10 aparências, e classificaram-los pelo seu melhor número médio de linha, como mostrado na coluna L.

Isso pode ser feito com uma fórmula ou algo semelhante? Pode estar no Excel ou no Google Docs. Eu faria isso manualmente, mas quando começa a ter 10 ou mais colunas, torna-se muito imponente.

Qualquer ajuda seria muito apreciada! Obrigado :)

    
por Jayden Lawson 28.01.2015 / 13:40

2 respostas

0

Este código criará a tabela que você deseja com os dados, conforme mostrado abaixo.

Código

/**
 * Create a specific table
 *
 * @param {range} names The range with names
 * @param {range} data The range of all the data
 * @return A specific table
 * @customfunction
 */
function myTable(names, data) {
  var output = [];
  for(var i = 0, iLen = names.length; i < iLen; i++) {
    var name = names[i][0], nameCount = 0, sum = 0, rows = [];
    for(var j = 0; j < 10; j++) {      
      for(var k = 0, kLen = data[0].length; k < kLen; k++) {
        if(names[i][0] == data[j][k]) {
          nameCount++;
          rows.push(j+1);
        }
      }
    }
    if(nameCount != 0) {
      sum = rows.reduce(function(a, b) {return a + b;});
      output.push([name, nameCount, rows.join(), sum/nameCount]);
    }    
  }
  return output.sort(function(a, b) {return b[1] - a[1];}).slice(0,5);
}

Screenshots

data

resultado

Explicado

O intervalo de nomes será usado para iniciar a iteração. No início do intervalo de dados, um contador é definido para esse nome específico mais uma matriz que conterá os números de linha. Se um nome foi encontrado mais de uma vez ( != 0 ), some os números das linhas e adicione os dados ao array de saída. Este array, por sua vez, está sendo classificado, usando a segunda coluna e apenas as primeiras 6 linhas são mostradas.

Nota

Não consegui reproduzir os resultados da sua planilha. Muito provavelmente porque os dados estão sendo renovados ao serem abertos todas as vezes. O exemplo que criei contém dados estáticos. As observações feitas no script servem uma função. Quando a função personalizada é selecionada na planilha, o pop-up de ajuda contém essa informação (JsDoc).

Exemplo

Eu criei um arquivo de exemplo para você: myTable
Adicione o código em Ferramentas > Editor de scripts, pressione o botão salvar e você está pronto para ir.

    
por 20.02.2015 / 23:44
0

Aqui está um link ao vivo planilha pública que tem a implementação desta solução e aqui está uma captura de tela para referência. Aqui está a descrição do problema:

Dada uma lista de nomes com 5 reorganizações desses nomes, classifique os nomes por (o número de vezes que o nome aparece no Top 10 [ascendente]) e então (a média do nome é Top 10 colocações [descendentes]).

Explicação-Colunas

  • AcolunaAéumalistadenomes
  • ColunaBéonúmerodos10principaisresultadosparaessenome
  • ColunaC-Gsãoreorganizaçõesaleatóriasdosnomes
  • AcolunaHcontémosquatromaioresvaloresdeB
  • AcolunaItemonúmerodenomesquetêmosvaloresH
  • AcolunaJéonúmerodalinhadonomeemL
  • ColunaKéointervaloparaprocuraropróximonomecomomesmoMvalor
  • ColunaL-Mtemosnomesordenadospelosseusvalores
  • AcolunaNusaJ-Mparacalcularamédiadecadanome
  • ColunaO-Qsãoosnomesclassificadosporvalore,emseguida,média!!

Explicação-Equações

'v'indicacopiar/colarnorestantedacoluna

'>'indicacopiar/colarparaorestodalinhaespecificada

  • A-nomesinseridosmanualmente(comalgunsnomesdeamostra,paramostrarquefunciona)
  • B-ContaonúmerodoTop10queéigualao
    • B1v=countif($C$1:$G$10,A1)
  • C-G-Reorganizaosnomesaleatoriamente[Nãoseiporquê]
    • C1>=sort($A$1:$A$27,arrayFormula(randbetween(sign(row($A$1:$A$27)),1000000)),true)
  • H-Filtretodososvaloresacimadomáximoanteriore,emseguida,localizeovalormáximodeB
    • H2=max($B$1:$B$60)
    • H4v=max(FILTER($B$1:$B$60,$B$1:$B$60<H2))
  • I-ConteosvaloresBquesãoiguaisaovalorHadjacente
    • I2v=countif($B$1:$B$60,"="&H2)
  • J - Se o valor do nome L (x) for menor que o anterior (y), encontre a linha da primeira correspondência de x em B, Else encontre a primeira correspondência de y no intervalo encontrado em K e desloque-se por o valor do J anterior
    • J2 =MATCH(M2,$B$1:$B$60,0)
    • J3 v =If(M3<M2,Match(M3,$B$1:$B$60,0), Match(M3,INDIRECT(K2),0)+J2)
  • K - Pegue a linha de J e coloque em um intervalo
    • K2 v ="B"&J2+1&":B60"
  • L-M - Classifica A1 a B27, por B em ordem decrescente
    • L2 =SORT(A1:B27,2,False)
  • N - Se este nome L aparecer no Top 10 do C, encontre a linha em que está, Else 0. Se este nome L aparecer no Top 10 do D, encontre a linha em que está, Else 0. etc. Agora adicione-os e divida pelo número de vezes que o nome L aparece para obter a média

    • N2 v

      =(IF(Countif($C$1:$C$10,"="&L2)>0, Match(L2,$C$1:$C$10,0), 0)
       +IF(Countif($D$1:$D$10,"="&L2)>0, Match(L2,$D$1:$D$10,0), 0)
       +IF(Countif($E$1:$E$10,"="&L2)>0, Match(L2,$E$1:$E$10,0), 0)
       +IF(Countif($F$1:$F$10,"="&L2)>0, Match(L2,$F$1:$F$10,0), 0)
       +IF(Countif($G$1:$G$10,"="&L2)>0, Match(L2,$G$1:$G$10,0), 0))/M2
      
  • O-Q - Ordene L-N por M ascendente e depois N descendente

    • O2 =SORT(L2:N28,2,False,3,True)
por 12.07.2015 / 00:34