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.
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.
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.
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.
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.)
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.
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
.
serialize
muss an eine Textverbindung gesendet werden, und anstatt in eine Datei zu schreiben, können Sie in die Konsole schreiben und sie erfassen.
Verwenden Sie deparse
mit control = "all"
, um die Umkehrbarkeit beim späteren erneuten Parsen zu maximieren.
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.
Die Verwendung von textConnection / saveRDS / loadRDS ist vielleicht die vielseitigste und höchste Ebene:
%Vor% Für sqlite
(und möglicherweise andere):
Jetzt in R
:
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.