rpy2: Преобразование data.frame к массиву numpy

У меня есть data.frame в R. Это содержит много данных: уровни экспрессии гена от многих (125) массивы. Я хотел бы данные в Python, главным образом благодаря моей некомпетентности в R и том, что это, как предполагалось, было 30-минутным заданием.

Я хотел бы, чтобы следующий код работал. Для понимания этого кода знайте что переменная path содержит полный путь к моему набору данных, который при загрузке дает мне названную переменную immgen. Знайте это immgen объект (Биопроводник ExpressionSet объект) и это exprs(immgen) возвращает кадр данных с 125 столбцами (эксперименты) и десятки тысяч строк (названный генами). (На всякий случай это не ясно, это - код Python, с помощью robjects.r для вызова кода 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)

Этот код выполнения, но expression_data просто array([[1]]).

Я вполне уверен это e не представляет кадр данных, сгенерированный exprs() из-за вещей как:

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

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

Но с другой стороны кто знает? Даже если e действительно представлял мой data.frame, который это не преобразовывает прямо в массив, было бы достаточно справедливо - кадр данных имеет больше в нем, чем массив (rownames и colnames), и поэтому возможно, жизнь не должна быть этим легким. Однако я все еще не могу разработать, как выполнить преобразование. Документация является немного слишком краткой для меня, хотя мое ограниченное понимание заголовков в документах подразумевает, что это должно быть возможно.

Кто-либо какие-либо мысли?

7
задан Mike Dewar 19 April 2010 в 17:51
поделиться

2 ответа

Зачем использовать data.frame, если exprs (immgen) возвращает / matrix /, а ваша конечная цель - поместить данные в матрицу?

Передача матрицы в numpy проста (и даже может быть сделано без копирования): http://rpy.sourceforge.net/rpy2/doc-2.1/html/numpy.html#from-rpy2-to-numpy

Это должно побить с точки зрения простоты и эффективности предлагается текстовое представление числовых данных в плоских файлах как способ обмена данными.

Похоже, вы работаете с классами биокондукторов, и, возможно, вас заинтересует следующее: http://pypi.python.org/pypi/rpy2-bioconductor-extensions/

4
ответ дан 6 December 2019 в 23:03
поделиться

Это самый Я нашел простой и надежный способ передачи фрейма данных из R в Python.

Начнем с того, что я считаю, что обмен данными через привязки R является ненужным осложнением. R предоставляет простой метод экспорта данных, аналогично NumPy имеет достойные методы для импорта данных. Формат файла - единственный общий интерфейс, требуемый здесь.

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

Согласно документации (и моему собственному опыту, чего стоит) loadtxt является предпочтительным методом для обычного импорта данных.

Вы также можете передать в loadtxt кортеж типов данных (аргумент - dtypes ), по одному элементу в кортеже для каждого столбца. Обратите внимание на 'skiprows = 1' для перехода по заголовкам столбцов (для loadtxt строки индексируются с 1, столбцы с 0).

Наконец, я преобразовал фактор кадра данных в целое число (которое фактически является базовым типом данных для фактора) перед экспортом - «unclass», вероятно, самый простой способ сделать это.

Если у вас большие данные (т. Е. Вы не хотите загружать весь файл данных в память, но все же нуждаетесь в нем) Отображенная в памяти структура данных NumPy ('memmap') является хорошей выбор:

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[:]
7
ответ дан 6 December 2019 в 23:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: