سؤال

لدي بيانات. الإطار في 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 هل تمثل البيانات الخاصة بي. إطار ، أنه لا يتحول مباشرة إلى صفيف سيكون عادلاً بما فيه الكفاية - يحتوي إطار البيانات على ذلك أكثر من الصفيف (الأسماء المتجهزة والأسماء) ، وبالتالي ربما لا ينبغي أن تكون الحياة بهذه السهولة. ومع ذلك ، ما زلت لا أستطيع معرفة كيفية إجراء التحويل. الوثائق هي بعض الشيء بالنسبة لي ، على الرغم من أن فهمي المحدود للعناوين في المستندات يعني أن هذا يجب أن يكون ممكنًا.

أي شخص أي أفكار؟

هل كانت مفيدة؟

المحلول

لماذا تمر عبر البيانات. الإطار عندما تُرجع "exprs (IMMGen)" A / 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) ، عنصر واحد في tuple لكل عمود. لاحظ "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[:]
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top