Speichern von R-Objekten in einer relationalen Datenbank

7

Ich erstelle häufig nichtparametrische Statistiken (Löss, Kerneldichten usw.) auf Daten, die ich aus einer relationalen Datenbank heraushole. Um die Datenverwaltung zu vereinfachen, möchte ich die R-Ausgabe in meiner Datenbank speichern. Dies ist mit einfachen Datenrahmen von Zahlen oder Text einfach, aber ich habe nicht herausgefunden, wie man R-Objekte in meiner relationalen Datenbank speichert. Gibt es also eine Möglichkeit, einen Vektor von Kerndichten beispielsweise in eine relationale Datenbank zu speichern?

Im Moment arbeite ich daran, indem ich die R-Objekte auf einem Netzwerklaufwerkplatz speichere, damit andere die Objekte nach Bedarf laden können.

    
JD Long 08.09.2009, 17:06
quelle

4 Antworten

9

Verwenden Sie die Serialisierungsfunktion, um ein beliebiges R-Objekt in eine (unverarbeitete oder Zeichen) Zeichenfolge umzuwandeln, und speichern Sie dann diese Zeichenfolge. Siehe help(serialize) .

Umkehren zum Abrufen: Holen Sie sich die Zeichenfolge und dann unserialize() in ein R-Objekt.

    
Dirk Eddelbuettel 08.09.2009, 17:31
quelle
9

Eine Beispiel-R-Variable, das ist ziemlich komplex:

%Vor%

Die beste Speicherdatenbankmethode für R-Variablen hängt davon ab, wie Sie sie verwenden möchten.

Ich muss eine datenbankinterne Analyse der Werte durchführen

In diesem Fall müssen Sie das Objekt in Werte zerlegen, die die Datenbank nativ verarbeiten kann. Dies bedeutet normalerweise, dass es in einen oder mehrere Datenrahmen umgewandelt wird. Der einfachste Weg, dies zu tun, ist das broom -Paket.

%Vor%

Ich möchte nur Speicherplatz

In diesem Fall möchten Sie Ihre R-Variablen serialisieren. Das heißt, sie in eine Zeichenfolge oder einen binären Blob umzuwandeln. Dafür gibt es mehrere Methoden.

Meine Daten müssen für andere Programme als R zugänglich sein und müssen lesbar sein

Sie sollten Ihre Daten in einem plattformübergreifenden Textformat speichern. wahrscheinlich JSON oder YAML. JSON unterstützt einige wichtige Konzepte wie Inf ; YAML ist allgemeiner, aber die Unterstützung in R ist nicht so ausgereift. XML ist ebenfalls möglich, aber zu ausführlich, um große Arrays zu speichern.

%Vor%

Meine Daten müssen für andere Programme als R zugänglich sein und müssen nicht von Menschen lesbar sein

Sie könnten Ihre Daten in ein offenes, plattformübergreifendes Binärformat wie HFD5 schreiben. Derzeit ist die Unterstützung für HFD5-Dateien (über rhdf5 ) begrenzt, also komplexe Objekte nicht unterstützt. (Sie müssen wahrscheinlich unclass alles.)

%Vor%

Mit dem Paket feather speichern Sie Datenrahmen in einem Format, das sowohl von R als auch von Python gelesen werden kann. Um dies zu verwenden, müssten Sie zuerst das Modellobjekt in Datenrahmen konvertieren, wie im Abschnitt "Besen" in der Antwort zuvor beschrieben.

%Vor%

Eine weitere Alternative besteht darin, eine Textversion der Variablen (siehe vorherigen Abschnitt) in einer gezippten Datei zu speichern und ihre Bytes in der Datenbank zu speichern.

%Vor%

Meine Daten müssen nur für R zugänglich sein und müssen lesbar sein

Es gibt zwei Möglichkeiten, eine Variable in eine Zeichenfolge umzuwandeln: serialize und < a href="http://www.inside-r.org/r-doc/base/deparse"> deparse .

%Vor%

serialize muss an eine Textverbindung gesendet werden, und anstatt in eine Datei zu schreiben, können Sie in die Konsole schreiben und sie erfassen.

%Vor%

Verwenden Sie deparse mit control = "all" , um die Umkehrbarkeit beim späteren erneuten Parsen zu maximieren.

%Vor%

Meine Daten müssen nur für R zugänglich sein und müssen nicht für Menschen lesbar sein

Dieselben Arten von Techniken, die in den vorherigen Abschnitten gezeigt wurden, können hier angewendet werden. Sie können eine serialisierte oder deklarierte Variable zippen und als Rohvektor erneut lesen.

serialize kann auch Variablen in einem Binärformat schreiben. In diesem Fall wird es am einfachsten mit dem Wrapper saveRDS verwendet.

%Vor%     
Richie Cotton 29.09.2014 10:58
quelle
2

Die Verwendung von textConnection / saveRDS / loadRDS ist vielleicht die vielseitigste und höchste Ebene:

%Vor%     
user1599018 20.04.2017 16:08
quelle
2

Für sqlite (und möglicherweise andere):

%Vor%

Jetzt in R :

%Vor%

Beachten Sie den list -Wrapper um some_object . Die Ausgabe von serialize ist ein Rohvektor. Ohne list würde die INSERT-Anweisung für jedes Vektorelement ausgeführt. Wenn Sie es in eine Liste einfügen, kann RSQLite::dbGetQuery es als ein Element anzeigen.

Um das Objekt von der Datenbank zurück zu bekommen:

%Vor%

Was passiert hier ist, nehmen Sie das Feld blob (das ist eine Liste, da RSQLite nicht weiß, wie viele Zeilen von der Abfrage zurückgegeben werden). Da LIMIT 1 sicherstellt, dass nur 1 Zeile zurückgegeben wird, nehmen wir es mit [[1]] , was der ursprüngliche rohe Vektor ist. Dann müssen Sie unserialize der rohe Vektor, um Ihr Objekt zu bekommen.

    
Davor Josipovic 31.10.2017 01:11
quelle

Tags und Links