Pergunta

Eu tenho um Data.Frame em R. Ele contém muitos dados: níveis de expressão gênica de muitas (125) matrizes. Gostaria dos dados em Python, devido principalmente à minha incompetência em R e ao fato de que esse deveria ser um emprego de 30 minutos.

Eu gostaria que o seguinte código funcionasse. Para entender este código, saiba que a variável path contém o caminho completo para o meu conjunto de dados que, quando carregado, me dá uma variável chamada immgen. Saiba disso immgen é um objeto (um biocondutor ExpressionSet objeto) e que exprs(immgen) Retorna um quadro de dados com 125 colunas (experimentos) e dezenas de milhares de linhas (genes nomeados). (Caso não esteja claro, este é o código python, usando robjects.r para ligar para o 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 é executado, mas expression_data e simples array([[1]]).

Tenho certeza disso e não representa o quadro de dados gerado por exprs() Devido a coisas como:

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

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

Mas novamente, quem sabe? Ainda que e Representou meus dados. No entanto, ainda não consigo descobrir como realizar a conversão. A documentação é um pouco concisa demais para mim, embora minha compreensão limitada dos títulos nos documentos implique que isso deve ser possível.

Alguém pensa?

Foi útil?

Solução

Por que passar por um data.frame quando 'exprs (immgen)' retorna a / matrix / e seu objetivo final é ter seus dados em uma matriz?

Passar a matriz para Numpy é direta (e pode até ser feita sem fazer uma cópia):http://rpy.sourceforge.net/rpy2/doc-2.1/html/numpy.html#from-rpy2-to-numpy

Isso deve superar a simplicidade e a eficiência, a sugestão de passar pela representação de texto de dados numéricos em arquivos planos como uma maneira de trocar dados.

Você parece estar trabalhando com aulas de biocondutor e pode estar interessado no seguinte:http://pypi.python.org/pypi/rpy2-bioconductor-extensions/

Outras dicas

Esta é a maneira mais direta e confiável que encontrei para transferir um quadro de dados de R para Python.

Para começar, acho que trocar os dados através das ligações R é uma complicação desnecessária. R fornece um método simples para exportar dados, da mesma forma, o Numpy possui métodos decentes para importação de dados. O formato de arquivo é a única interface comum necessária aqui.

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 acordo com a documentação (e minha própria experiência pelo que vale a pena) loadtxt é o método preferido para importação de dados convencional.

Você também pode passar para loadtxt uma tupla de tipos de dados (o argumento é dtypes), um item na tupla para cada coluna. Observe 'Skiprows = 1' para passar pelos cabeçalhos da coluna (para loadtxt As linhas são indexadas de 1, colunas de 0).

Por fim, converti o fator de dados de dados para o número inteiro (que na verdade é o tipo de dados subjacente para o fator) antes da exportação-'desmarcar' é provavelmente a maneira mais fácil de fazer isso.

Se você tem big data (ou seja, não deseja carregar o arquivo de dados inteiro na memória, mas ainda precisa acessá -lo) Estrutura de dados mapeada de memória de Numpy ('Memmap') é uma boa escolha:

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 em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top