Frage

habe ich ein data.frame in R. Es eine Menge Daten enthält: Gen-Expressionsniveaus von vielen (125) Arrays. Ich würde die Daten in Python sehen, vor allem aufgrund meiner Inkompetenz in R und die Tatsache, dass diese angeblich ein 30-minütige Job sein.

Ich möchte den folgenden Code an die Arbeit. Um diesen Code zu verstehen, wissen, dass die Variable path den vollständigen Pfad zu meinem Datensatz enthält, die, wenn geladen, mir eine Variable gibt genannt immgen. Wissen Sie, dass immgen ein Objekt (ein Bioconductor ExpressionSet Objekt) und dass exprs(immgen) liefert ein Datenrahmen mit 125 Spalten (Versuche) und Zehntausende von Zeilen (genannt Genen). (Für den Fall, es ist nicht klar, das ist Python-Code, mit robjects.r zu Anruf R-Code)

import numpy as np
import rpy2.robjects as robjects
# ... some code to build path
robjects.r("load('%s')"%path) # loads immgen
e = robjects.r['data.frame']("exprs(immgen)")
expression_data = np.array(e)

Dieser Code läuft, aber expression_data ist einfach array([[1]]).

Ich bin mir ziemlich sicher, dass e nicht den Datenrahmen von exprs() erzeugt darstellt aufgrund Dinge wie:

In [40]: e._get_ncol()
Out[40]: 1

In [41]: e._get_nrow()
Out[41]: 1

Aber dann wieder, wer weiß? Auch wenn e meiner data.frame tat vertreten, dass es nicht gerade auf ein Array fair genug wäre konvertiert - ein Datenrahmen hat mehr drin als ein Array (rownames und COLNAMES) und so vielleicht das Leben sollte nicht so einfach sein . Allerdings kann ich immer noch nicht herausfinden, wie die Umwandlung durchzuführen. Die Dokumentation ist ein wenig zu kurz und bündig für mich, obwohl mein begrenztes Verständnis für die Positionen in der Dokumentation impliziert, dass dies möglich sein sollte.

jemand irgendwelche Gedanken?

War es hilfreich?

Lösung

Warum durch eine data.frame gehen, wenn 'exprs (immgen)' kehrt a / Matrix / und Ihr Endziel ist Ihre Daten in einer Matrix haben?

die Matrix zu numpy Pass ist einfach (und kann sogar ohne eine Kopie gemacht werden): http: //rpy.sourceforge. net / rpy2 / doc-2.1 / html / numpy.html # from-rpy2-to-numpy

Dies sollte sowohl schlagen in der Einfachheit und Effizienz den Vorschlag in flachen Dateien als eine Möglichkeit zum Austausch von Daten durch Textdarstellung von numerischen Daten gehen.

Sie scheinen mit Bioconductor Klassen zu arbeiten, und könnten in den folgenden interessiert: http://pypi.python.org/pypi/rpy2-bioconductor-extensions/

Andere Tipps

Dies ist die einfachste und zuverlässigste Weg, die ich gefunden habe, um einen Datenrahmen von R auf Python zu übertragen.

mit zu beginnen, ich denke, dass die Daten durch die R-Bindungen Austausch ist eine unnötige Komplikation. R, ein einfaches Verfahren zu Exportdaten liefert, ebenso hat NumPy anständige Methoden für den Datenimport. Das Dateiformat ist die einzige gemeinsame Schnittstelle erforderlich hier.

data(iris)
iris$Species = unclass(iris$Species)

write.table(iris, file="/path/to/my/file/np_iris.txt", row.names=F, sep=",")

# now start a python session
import numpy as NP

fpath = "/path/to/my/file/np_iris.txt"

A = NP.loadtxt(fpath, comments="#", delimiter=",", skiprows=1)

# print(type(A))
# returns: <type 'numpy.ndarray'>

print(A.shape)
# returns: (150, 5)

print(A[1:5,])
# returns: 
 [[ 4.9  3.   1.4  0.2  1. ]
  [ 4.7  3.2  1.3  0.2  1. ]
  [ 4.6  3.1  1.5  0.2  1. ]
  [ 5.   3.6  1.4  0.2  1. ]]

Nach der Dokumentation (und meine eigenen Erfahrung für das, was es wert ist) loadtxt ist die bevorzugte Methode für die konventionellen Datenimport.

Sie kann auch in weitergeben loadtxt ein Tupel von Datentypen (das Argument dtypes ), ein Element in dem Tupel für jede Spalte. Hinweis 'skiprows = 1' zu Schritt über die Spaltenüberschriften (für loadtxt Zeilen sind indexiert 1, Spalten 0).

Schließlich konvertierte i den Datenrahmen Faktor ganze Zahl (die eigentlich der zugrunde liegende Datentyp für den Faktor ist) vor dem Export - ‚unclass‘ ist wahrscheinlich der einfachste Weg, dies zu tun

.

Wenn Sie große Datenmengen haben (dh nicht die gesamte Datendatei in dem Speicher nicht geladen werden soll, aber immer noch brauchen, um Zugang it) NumPy des memory-mapped Datenstruktur ( ‚memmap‘) ein gute Wahl:

from tempfile import mkdtemp
import os.path as path

filename = path.join(mkdtemp(), 'tempfile.dat')

# now create a memory-mapped file with shape and data type 
# based on original R data frame:
A = NP.memmap(fpath, dtype="float32", mode="w+", shape=(150, 5))

# methods are ' flush' (writes to disk any changes you make to the array), and 'close'
# to write data to the memmap array (acdtually an array-like memory-map to 
# the data stored on disk)
A[:] = somedata[:]
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top