Bedingte Datenmanipulation in Mathematica

8

Ich versuche, die besten Tools für eine effiziente Datenanalyse in Mathematica vorzubereiten. Ich habe ungefähr 300 Spalten & amp; 100 000 Zeilen.

Was wären die besten Tricks für:

"Entfernen", "Extrahieren" oder einfach "Betrachte" Teile der Datenstruktur, zum Beispiel für Plot.

Eines der schwierigsten Beispiele, an die ich denken könnte, ist:

  

Gegeben eine Datenstruktur,

     

Extrahieren Sie die Spalten 1 bis 3, 6 bis 9 sowie den letzten für jede Zeile, in der der Wert in Spalte 2 gleich x ist und der Wert in Spalte 8 anders als y

ist

Ich begrüße auch allgemeine Hinweise zur Datenmanipulation.

    
500 25.05.2011, 20:10
quelle

4 Antworten

6

Für eine generische Manipulation von Daten in einer Tabelle mit benannten Spalten verweise ich Sie auf Select manuell zu schreiben. Für viele Spalten und viele verschiedene Abfragen sind die Chancen, Indizes zu durcheinander zu bringen, jedoch hoch. Hier ist die modifizierte Lösung aus dem erwähnten Post, die eine freundlichere Syntax bietet:

%Vor%

Was passiert, ist, dass die in Select verwendete Funktion automatisch aus Ihren Spezifikationen generiert wird. Zum Beispiel (mit @ Yodas Beispiel):

%Vor%

Wir müssen die Spaltennamen definieren (müssen Strings oder Symbole ohne Werte sein):

%Vor%

(in der Praxis sind die Namen normalerweise aussagekräftiger). Hier ist die Tabelle dann:

%Vor%

Hier ist die Select-Anweisung, die Sie benötigen (ich habe x = 4 und y=2 ausgewählt):

%Vor%

Dies kann für eine einzelne Abfrage wie eine komplizierte Methode aussehen. Sie können jedoch viele verschiedene Abfragen durchführen, z. B.

%Vor%

und ähnlich.

Wenn es spezifische Korrelationen in Ihren Daten gibt, können Sie natürlich einen speziellen Spezialalgorithmus finden, der schneller ist. Die obige Funktion kann auf viele Arten erweitert werden, um allgemeine Abfragen zu vereinfachen (einschließlich "all" usw.) oder die generierte reine Funktion automatisch zu kompilieren (wenn möglich).

BEARBEITEN

Aus philosophischer Sicht bin ich mir sicher, dass sich viele Mathematica-Benutzer (ich selbst eingeschlossen) immer wieder ähnlichen Code geschrieben haben. Die Tatsache, dass Mathematica eine präzise Syntax hat, macht es oft sehr einfach, für einen bestimmten Fall zu schreiben. Solange jedoch in einer bestimmten Domäne gearbeitet wird (wie z. B. Datenmanipulationen in einer Tabelle), sind die Kosten für die Wiederholung selbst für viele Operationen hoch. Was mein Beispiel in einer sehr einfachen Einstellung veranschaulicht, ist ein möglicher Ausweg: Erstellen Sie eine domänenspezifische Sprache (DSL). Dazu muss man in der Regel eine Syntax / Grammatik definieren und einen Compiler daraus in Mathematica schreiben (um automatisch Mathematica-Code zu generieren). Nun, das obige Beispiel ist eine sehr primitive Realisierung dieser Idee, aber mein Punkt ist, dass Mathematica im Allgemeinen sehr gut für die DSL-Erstellung geeignet ist, was ich für eine sehr leistungsfähige Technik halte.

    
Leonid Shifrin 25.05.2011, 21:15
quelle
4
%Vor%

Einige nützliche Befehle zum Abrufen von Matrizen und Listen sind Span (;;), Drop , Take , Select , Cases und mehr. Siehe Tutorial / GettingAndSettingPiecesOfMatrices und guide / PartsOfMatrices ,

Part ([[...]]) in Kombination mit ;; kann ziemlich mächtig sein. a [[All, 1 ;;; 1 ;; 2]] bedeutet zum Beispiel, dass alle Zeilen und alle ungeraden Spalten (-1 mit der üblichen Bedeutung des Zählens vom Ende) genommen werden.

Select kann verwendet werden, um Elemente aus einer Liste auszuwählen (und sich daran zu erinnern, dass eine Matrix eine Liste von Listen ist), basierend auf einer logischen Funktion. Es ist Zwillingsbruder ist Cases , die Auswahl basierend auf einem Muster tut. Die Funktion, die ich hier verwendete, ist eine "reine" Funktion , wobei # sich auf das Argument bezieht, auf das diese Funktion angewendet wird wird angewendet (in diesem Fall die Elemente der Liste). Da die Elemente selbst Listen sind (die Zeilen der Matrix), kann ich mit der Funktion Part ([[..]]) auf die Spalten verweisen.

    
Sjoerd C. de Vries 25.05.2011 20:36
quelle
1

Um Spalten (oder Reihen) herauszuziehen, können Sie es durch Teilindizierung tun

%Vor%

Die letzte Zeile ist nur um es hübsch anzusehen.

Wie Sjoerd in seinem Kommentar (und in der Erklärung in seiner Antwort) erwähnt hat, kann die Indizierung eines einzelnen Bereichs leicht mit dem Span ( ;; ) Befehl. Wenn Sie mehrere disjunkte Bereiche verbinden, verwenden Sie Flatten zum Kombinieren Die separaten Bereiche, die mit Range erstellt wurden, sind einfacher als die Eingabe per Hand.

    
abcd 25.05.2011 20:30
quelle
1

Ich lese:

  

Extrahieren Sie die Spalten 1 bis 3, 6 bis 9 sowie den letzten für jede Zeile, in der der Wert in Spalte 2 gleich x ist und der Wert in Spalte 8 anders als y

ist

bedeutet, dass wir wollen:

  • Elemente 1-3 und 6-9 aus jeder Zeile

AND

  • das letzte Element aus den Zeilen mit [[2]] == x && [[8]] != y .

Das habe ich zusammen gehackt:

%Vor%     
Mr.Wizard 26.05.2011 11:02
quelle