Pregunta

Tengo un hoja.de.datos en R. Contiene una gran cantidad de datos: niveles de expresión génica de muchas matrices (125). Me gustaría que los datos en Python, sobre todo debido a mi incompetencia en R y el hecho de que esto iba a ser un trabajo de 30 minutos.

Me gustaría que el siguiente código al trabajo. Para entender este código, sabe que el path variable contiene la ruta completa al conjunto de datos que, una vez cargado, me da una variable llamada immgen. Sabe que immgen es un objeto (un objeto ExpressionSet Bioconductor) y que vuelve exprs(immgen) una trama de datos con 125 columnas (experimentos) y decenas de miles de filas (llamado genes). (Sólo en caso de que no está claro, se trata de código Python, utilizando robjects.r al llamado código R)

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)

Este código se ejecuta, pero expression_data es simplemente array([[1]]).

Estoy bastante seguro de que e no representa la trama de datos generada por exprs() debido a cosas como:

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

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

Pero, de nuevo ¿quién sabe? Incluso si e hizo representar a mi hoja.de.datos, que no convierte directamente a una matriz sería bastante justo - una trama de datos tiene más en él que un array (rownames y COLNAMES) y así tal vez la vida no debería ser tan fácil . Sin embargo todavía no puedo encontrar la manera de realizar la conversión. La documentación es un poco demasiado escueta para mí, aunque mi limitada comprensión de los capítulos de los documentos implica que esto debería ser posible.

Cualquier persona alguna idea?

¿Fue útil?

Solución

¿Por qué pasar por un hoja.de.datos cuando exprs '(immgen)' devuelve un / matriz / y su objetivo final es tener sus datos en una matriz?

Pasando la matriz para numpy es sencillo (e incluso se puede hacer sin hacer una copia): http: //rpy.sourceforge. / rpy2 neta / doc-2.1 / html / numpy.html # de-rpy2 a numpy

Esto debe superar tanto la simplicidad y eficiencia la sugerencia de ir a través de la representación de texto de los datos numéricos en archivos planos como una manera de intercambiar datos.

Usted parece estar trabajando con clases Bioconductor, y puede estar interesado en los siguientes: http://pypi.python.org/pypi/rpy2-bioconductor-extensions/

Otros consejos

Esta es la forma más sencilla y confiable que he encontrado para transferir una trama de datos de R a Python.

Para empezar, creo que el intercambio de los datos a través de los enlaces de R es una complicación innecesaria. R proporciona un método simple para exportar datos, del mismo modo, NumPy tiene métodos dignas para importación de datos. El formato del archivo es la única interfaz común requiere aquí.

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. ]]

De acuerdo con la documentación (y mi propia experiencia de lo que vale) loadtxt es el método preferido para la importación de datos convencional.

También puede pasar a loadtxt una tupla de tipos de datos (el argumento es dtypes ), un elemento de la tupla para cada columna. 'skiprows = 1' aviso a pasar por encima de los encabezados de columna (por loadtxt filas están indexados de 1, columnas de 0).

Finalmente, i convirtió el factor de trama de datos a número entero (que es realmente el tipo de datos subyacente para el factor) antes de exportar - 'unclass' es probablemente la manera más fácil de hacer esto

.

Si usted tiene grandes volúmenes de datos (es decir, no quieren cargar todo el archivo de datos en la memoria, pero todavía tienen que acceder a ella) estructura de datos asignado a la memoria de NumPy ( 'memmap') es una buena elección:

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[:]
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top