Question

J'ai un data.frame R. Il contient beaucoup de données: niveaux d'expression génique des réseaux de nombreux (125). Je voudrais les données en Python, principalement en raison de mon incompétence en R et le fait que ce devait être un travail de 30 minutes.

Je voudrais le code suivant au travail. Pour comprendre ce code, sachez que la path variable contient le chemin complet à mon ensemble de données qui, lorsqu'il est chargé, me donne une variable appelée immgen. Sachez que immgen est un objet (un objet ExpressionSet Bioconductor) et que le rendement de exprs(immgen) une trame de données avec 125 colonnes (expériences) et des dizaines de milliers de lignes (gènes nommés). (Juste au cas où on ne sait pas, ce code est en Python, en utilisant robjects.r à l'appel code 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)

Ce code se exécute, mais expression_data est tout simplement array([[1]]).

Je suis sûr que e ne représente pas la trame de données générées par exprs() en raison de choses comme:

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

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

Mais là encore, qui sait? Même si e ne représentait mon data.frame, qu'il ne convertit pas droit à un tableau serait assez juste - une trame de données a plus en elle qu'un tableau (rownames et colnames) et donc peut-être la vie ne devrait pas être aussi facile . Cependant, je ne peux toujours pas travailler sur la façon d'effectuer la conversion. La documentation est un peu trop laconique pour moi, bien que ma compréhension limitée des rubriques dans la documentation implique que cela devrait être possible.

Toute personne des pensées?

Était-ce utile?

La solution

Pourquoi passer par un data.frame quand « exprs (immgen) » renvoie une / matrice / et votre objectif final est d'avoir vos données dans une matrice?

En passant la matrice à numpy est simple (et peut même être fait sans faire une copie): http: //rpy.sourceforge. net / rpy2 / doc-2.1 / html / numpy.html # de-rpy2 à numpy

Cela devrait battre à la fois la simplicité et l'efficacité de la suggestion de passer par la représentation de texte des données numériques dans des fichiers plats comme un moyen pour échanger des données.

Vous semblez travailler avec des classes de Bioconductor, et peut-être intéressé par ce qui suit: http://pypi.python.org/pypi/rpy2-bioconductor-extensions/

Autres conseils

Ceci est la façon la plus simple et fiable que j'ai trouvé à transférer une trame de données de R à Python.

Pour commencer, je pense que l'échange des données à travers les liaisons R est une complication inutile. R fournit une méthode simple pour exporter des données, de même, NumPy a des méthodes convenables pour l'importation de données. Le format de fichier est la seule interface commune nécessaire ici.

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

D'après la documentation (et ma propre expérience pour ce que ça vaut) loadtxt est la méthode préférée pour l'importation de données classique.

Vous pouvez également passer pour loadtxt un tuple de types de données (l'argument est dtypes ), un élément dans la tuple pour chaque colonne. Remarque 'skiprows = 1' à l'étape sur les en-têtes de colonnes (pour loadtxt lignes sont indexés à partir de 1, les colonnes à partir de 0).

Enfin, je me suis converti le facteur de dataframe à l'entier (qui est en fait le type de données sous-jacentes pour le facteur) avant l'exportation - « unclass » est probablement le

meilleure façon de le faire.

Si vous avez de grandes données (c.-à-ne veulent pas charger l'intégralité du fichier de données en mémoire, mais encore besoin d'y accéder) structure de données mappés en mémoire de NumPy ( « memmap ») est un bon choix:

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[:]
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top