2016-04-29 16 views
1

Ich arbeite an Daten aus einer Bevölkerung von Menschen mit Allergien. Jede Person hat eine eindeutige ExceptionID und jedes Allergen hat eine eindeutige AllergenID (insgesamt 451).Sumproduct oder Countif auf einer 2D-Matrix

Ich habe eine Datentabelle mit 2 Spalten (ExceptionID und AllergenID), wo die Allergien jeder Person Zeile für Zeile aufgeführt sind. Dies bedeutet, dass die Spalte "ExceptionID" wiederholte Werte für Personen mit multiplen Allergien aufweist und die Spalte "AllergenID" wiederholte Werte für die verschiedenen Personen enthält, die diese Allergie haben.

Ich versuche zu zählen, wie oft jedes Paar von Allergien in dieser Population vorhanden ist (z. B. Allergen # 107 & Allergen # 108, Allergen # 107 & Allergen # 109, etc). Um es einfach zu halten, habe ich eine Matrix von 451 Zeilen X 451 Spalten erstellt, die jedes Paar repräsentieren (zweimal, weil A/B und B/A gleichwertig sind).

Ich muss irgendwie den Zeilennamen (AllergenID) verwenden, um die ExceptionID in meiner Datentabelle nachzuschlagen, und die Fälle zählen, in denen die ExceptionIDs vom Spaltennamen (auch AllergenID) übereinstimmen. Ich habe kein Problem mit Vlookup oder Index/Match, aber ich kämpfe mit der richtigen Kombination eines Nachschlagens und Sumproduct oder Countif Formel.

Jede Hilfe wird sehr geschätzt!

Mike PS Ich benutze Excel 2016, wenn das etwas ändert.

- = UPDATE = - Also die von Dirk und MacroMarc vorgeschlagenen Methoden funktionierten beide, obwohl ich letzteres nicht auf meinen vollständigen Datensatz anwenden konnte (17.000+ Zeilen), weil es lange gedauert hat.

Ich habe mich entschieden, dies in ein VBA-Makro zu verwandeln, weil wir jetzt die Anzahl der Triplets statt der Paare sehen wollen.

+0

Versuchen zu klären - für jede Ausnahmekennung möchten Sie Paare von Allergen-IDs identifizieren, die auftreten. Richtig? – OldUgly

+0

Das ist total eine @scottcanner Frage = P Wer schuldet mir noch ein Makro um meine Wäsche zu waschen. – findwindow

+0

Oder ein anderer Weg - wenn eine ExceptionID zweimal auftritt, wird es ein AllergenID-Paar geben; Wenn eine ExceptionID dreimal auftritt, wird es drei AllergenID-Paare geben; Wenn ExceptionID viermal auftritt, wird es sechs AllergenID-Paare geben; und so weiter. – OldUgly

Antwort

0

Mit den 2 Spalten, mit denen Sie beginnen, ist es so gut wie unmöglich ... Sie müssten jede ExceptionID überprüfen, um 2 verschiedene spezifische AllergenID zu haben. Verwenden Sie lieber eine Hilfstabelle mit ExceptionID als Zeilen und AllergenID als Spalten (oder das Gegenteil ... was auch immer Sie mögen). Die Hilfstabelle benötigt eine Formel wie:

Welche kann dann automatisch ausgefüllt werden. (Die Bereiche stammen aus meinem Beispiel, Sie müssen sie nach Ihren Bedürfnissen ändern).

Mit dieser Helfer-Matrix Sie leicht für Ihre größere Matrix so gehen kann:

=COUNTIFS(E:E,1,INDEX($E:$G,,MATCH($I2,$E$1:$G$1,0)),1) 

Wieder Sie auto-fill mit dieser Formel können, aber Sie müssen es ändern, so dass es Ihren Bedürfnissen entspricht .
Da die Spalten die gleiche ID2 haben (dies wäre Ihre AllergenID), brauchen Sie sie nicht zu suchen, da sich E:E automatisch mit der automatischen Füllung ändert.

Der wichtigste Teil der Formeln sind die $, die nicht durcheinander gebracht werden sollten, oder Sie können es nicht automatisch ausfüllen.

Bild von meinem selbstgemachten Beispiel (Formeln sind von der oberen linken Zelle in jeder Tabelle):
enter image description here

Wenn Sie noch Fragen haben, fragen Sie einfach :)

+0

Das ist auch ein guter Weg um nach Doppel zu suchen ... die Helfer-Tabelle sollte nur 0 'und 1's enthalten;) –

+0

Dirk, das ist fantastisch! Ich hatte darüber nachgedacht, einen Hilfstisch zu benutzen, konnte aber nicht sehen, wie es anders wäre, als direkt zum Endergebnis zu springen. Vielen Dank für Ihre Hilfe und schnell auch! Ich habe törichterweise vergessen, meine Dateien in mein Google-Laufwerk zu kopieren, so dass Tests auf den tatsächlichen Daten warten müssen bis Montag, aber die Testdaten, die Sie erstellt haben, ahmt die reale Sache recht gut nach. – MikeG

+0

Gern geschehen :) –

0

Es kann getan werden direkt von Ihrem ursprünglichen Set-up mit Matrixformeln:

Bitte beachten Sie, dass Matrixformeln eingegeben werden muß, mit Ctrl-Shift-Enter, vor dem Kopieren auf und ab:

enter image description here

Im Beispielbild habe ich die Datenbereiche $ A $ 2: $ A $ 21 als 'People' und $ B $ 2: $ B $ 21 als 'Allergene' angegeben, um eine bessere Abstimmung zu ermöglichen. In der Formelleiste sehen Sie, wie das als Formel aussieht. Allerdings könnten Sie die Standard-Referenzen wie folgt in Ihrer ersten Matrix-Zelle verwenden:

EDIT: alberne mich, N-Funktion ist nicht erforderlich, um die Boolean in 1 und 0 zu verwandeln, da Multiplikation Booleans wird den Trick tun. Unten Formel funktioniert ...

SUM(IF(MATCH($A$2:$A$21,$A$2:$A$21,0)=ROW($A$2:$A$21)-1, NOT(ISERROR(MATCH($A$2:$A$21&$E2,$A$2:$A$21&$B$2:$B$21,0)))*NOT(ISERROR(MATCH($A$2:$A$21&F$1, $A$2:$A$21&$B$2:$B$21,0))), 0))

Kopieren Sie dann von F2 auf und ab. Es kann möglicherweise in der Technik mit sumproduct oder was auch immer verbessert werden, aber es ist nur ein grobes Beispiel der Technik ....

+0

Danke Marc, ich gebe dir auch einen Ansatz, wenn ich am Montag zur Arbeit komme. Irgendeine Idee, welche der beiden Methoden ist wahrscheinlich schneller? Ich denke eine 451x451 Matrix wird einige Zeit brauchen ... – MikeG