Tabellenkalkulation, die das häufigste Auftreten von Namen findet und sortiert

0

Ich habe eine Tabelle, die wie folgt aussieht:

https://docs.google.com/spreadsheets/d/1BN3GNRFCsBeHu9gQaKzIo7bfFRkcDqMJ6VMtidEwPD4/edit?usp=sharing

In Spalte A gibt es eine festgelegte Liste von Namen. Diese Namen werden in jeder der folgenden Spalten von C bis G einmal in zufälliger Reihenfolge angezeigt.

Wie kann ich ein Ergebnis erzeugen, das ich in Spalte I manuell erstellt habe? Ich würde gerne wissen, welche Namen in den Zeilen 1-10 in den Spalten C bis G am häufigsten vorkommen und welche Namen dann die beste durchschnittliche Zeilennummer haben.

Ich habe manuell herausgefunden, dass "Name C6" mit 4 Auftritten am häufigsten auftauchte. Dann fand ich vier weitere Namen mit drei Top-10-Auftritten und sortierte sie nach der besten durchschnittlichen Zeilennummer, wie in Spalte L gezeigt.

Kann man das mit einer Formel oder ähnlichem machen? Es kann in Excel oder Google Docs sein. Ich würde es manuell machen, aber wenn es 10 oder mehr Spalten gibt, wird es sehr imposant.

Jede Hilfe wäre sehr dankbar! Vielen Dank :)

Jayden Lawson
quelle
Was hast du schon probiert Wo steckst du fest? Sie sollten statt des Dokuments Screenshots oder Beispieldaten bereitstellen, da viele Benutzer diese nicht öffnen möchten.
Raystafarian
Haben Sie meine Lösung für sehr wertvoll befunden?
Jacob Jan Tuinstra

Antworten:

0

Dieser Code erstellt die gewünschte Tabelle mit den unten gezeigten Daten.

Code

/**
 * 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

Daten
Bildbeschreibung hier eingeben

Ergebnis
Bildbeschreibung hier eingeben

Erklärt

Der Namensbereich wird verwendet, um die Iteration mit zu starten. Zu Beginn des Datenbereichs wird ein Zähler für diesen bestimmten Namen sowie ein Array festgelegt, das die Zeilennummern enthält.
Wenn ein Name mehrmals gefunden wurde ( != 0), addieren Sie die Zeilennummern und fügen Sie die Daten zum Ausgabearray hinzu. Dieses Array wird wiederum anhand der zweiten Spalte sortiert, und nur die ersten 6 Zeilen werden angezeigt.

Hinweis

Ich konnte die Ergebnisse Ihres Blattes nicht reproduzieren. Höchstwahrscheinlich, weil die Daten beim Öffnen jedes Mal neu aktualisiert werden. Das Beispiel, das ich erstellt habe, enthält statische Daten. Die im Skript gemachten Anmerkungen dienen einer Funktion. Wenn die benutzerdefinierte Funktion im Arbeitsblatt ausgewählt ist, enthält das Hilfe-Popup diese Informationen (JsDoc).

Beispiel

Ich habe eine Beispieldatei für Sie erstellt: myTable
Fügen Sie den Code unter Extras > Skripteditor hinzu, klicken Sie auf die Schaltfläche Speichern, und Sie können loslegen .

Jacob Jan Tuinstra
quelle
0

Hier finden Sie einen Link zur öffentlichen Live-Tabelle mit der Implementierung dieser Lösung. Hier finden Sie einen Screenshot als Referenz. Hier ist die Problembeschreibung:

Sortieren Sie die Namen anhand einer Liste mit 5 Neuanordnungen dieser Namen nach (der Häufigkeit, mit der der Name in den Top 10 aufsteigend angezeigt wird) und dann nach (dem Durchschnitt der Top 10-Platzierungen des Namens absteigend). .

Screenshot der Tabellenkalkulation

Erklärung - Spalten

  • Spalte A ist eine Liste von Namen
  • Spalte B ist die Anzahl der Top-10-Treffer für diesen Namen
  • Column CG sind zufällige Neuanordnungen der Namen
  • Spalte H enthält die vier höchsten Werte von B
  • Spalte I enthält die Anzahl der Namen mit den H- Werten
  • Spalte J ist die Zeilennummer des Namens in L
  • Spalte K ist der Bereich, in dem nach dem nächsten Namen mit demselben M- Wert gesucht werden soll
  • In Spalte LM sind die Namen nach ihren Werten sortiert
  • Spalte N verwendet JM , um den Durchschnitt für jeden Namen zu berechnen
  • Column OQ sind die Namen sortiert nach Wert und dann Durchschnitt !!

Erklärung - Gleichungen

' v ' kennzeichnet das Kopieren / Einfügen zum Rest der Spalte

' > ' gibt an, dass die angegebene Zeile kopiert / eingefügt werden soll

  • A - Manuell eingegebene Namen (Mit einigen Beispielnamen, um zu zeigen, dass es funktioniert)
  • B - Zählt die Anzahl der Top 10, die gleich dem sind
    • B1 v=countif($C$1:$G$10,A1)
  • CG - Ordnet die Namen nach dem Zufallsprinzip neu
    • C1 >=sort($A$1:$A$27,arrayFormula(randbetween(sign(row($A$1:$A$27)),1000000)),true)
  • H - Alle Werte herausfiltern, die größer sind als das vorherige Maximum und dann das Maximum von B ermitteln
    • H2=max($B$1:$B$60)
    • H4 v=max(FILTER($B$1:$B$60,$B$1:$B$60<H2))
  • I - Zählen Sie die B-Werte, die dem benachbarten H-Wert entsprechen
    • I2 v=countif($B$1:$B$60,"="&H2)
  • J - Wenn der Wert (x) dieses L-Namens kleiner als der vorherige (y) ist, suchen Sie die Zeile der ersten Übereinstimmung von x in B, andernfalls suchen Sie die erste Übereinstimmung von y in dem in K gefundenen Bereich und versetzt um den Wert von der vorherige J
    • 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 - Nehmen Sie die Reihe von J und machen Sie es in einen Bereich
    • K2 v="B"&J2+1&":B60"
  • LM - Sortieren Sie A1 bis B27 nach B in absteigender Reihenfolge
    • L2=SORT(A1:B27,2,False)
  • N - Wenn dieser L-Name in den Top 10 von C angezeigt wird, suchen Sie die Zeile, in der er sich befindet, sonst 0. Wenn dieser L-Name in den Top 10 von D angezeigt wird, suchen Sie die Zeile, in der er sich befindet, sonst 0. usw. Addieren Sie nun diese Werte und dividieren Sie durch die Häufigkeit, mit der der Name L angezeigt wird, um den Durchschnitt zu erhalten

    • 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
      
  • OQ - Sortiere LN nach M aufsteigend und dann nach N absteigend

    • O2=SORT(L2:N28,2,False,3,True)
NichtlinearFruit
quelle