У меня есть 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), и поэтому возможно, жизнь не должна быть этим легким. Однако я все еще не могу разработать, как выполнить преобразование. Документация является немного слишком краткой для меня, хотя мое ограниченное понимание заголовков в документах подразумевает, что это должно быть возможно.
Кто-либо какие-либо мысли?
Зачем использовать 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/
Это самый Я нашел простой и надежный способ передачи фрейма данных из 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[:]