2010-04-19 37 views
7

मैं एक data.frame आर में यह डेटा का एक बहुत कुछ शामिल है के लिए एक data.frame परिवर्तित: जीन अभिव्यक्ति के स्तर को कई (125) सरणियों से। मुझे पायथन में डेटा चाहिए, ज्यादातर आर में मेरी अक्षमता के कारण और तथ्य यह है कि यह 30 मिनट का काम माना जाता था।rpy2: एक numpy सरणी

मैं निम्नलिखित कोड काम करना चाहते हैं। इस कोड को समझने के लिए, पता है कि परिवर्तनीय path में मेरे डेटा सेट का पूरा पथ है, जो लोड होने पर मुझे immgen नामक एक चर देता है। यह जान लें कि immgen एक वस्तु (एक BioConductor ExpressionSet वस्तु) और कहा कि exprs(immgen) रिटर्न 125 कॉलम (प्रयोगों) और पंक्तियों की हजारों (नाम जीन) के साथ एक डेटा फ्रेम है।

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) 

इस कोड को चलाता है (बस मामले में यह स्पष्ट नहीं है, इस अजगर कोड, robjects.r का उपयोग कर आर कोड कॉल करने के लिए है), लेकिन expression_data बस array([[1]]) है।

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

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

लेकिन तब फिर कौन जानता है:

मैं जैसी चीजों की वजह से बहुत यकीन है कि eexprs() द्वारा उत्पन्न डेटा फ्रेम का प्रतिनिधित्व नहीं करता है? यहां तक ​​कि यदि e ने मेरे डेटा.फ्रेम का प्रतिनिधित्व किया है, तो यह सीधे सरणी में परिवर्तित नहीं होता है, यह पर्याप्त होगा - एक डेटा फ्रेम में सरणी (राउनम्स और उपनाम) से अधिक है और इसलिए शायद यह आसान नहीं होना चाहिए । हालांकि मैं अभी भी रूपांतरण करने के लिए काम नहीं कर सकता। दस्तावेज मेरे लिए थोड़ा सा झुकाव है, हालांकि दस्तावेज़ों में शीर्षकों की मेरी सीमित समझ का तात्पर्य है कि यह संभव होना चाहिए।

कोई भी विचार?

उत्तर

4

'exprs (immgen)' एक/मैट्रिक्स/और आपका अंतिम लक्ष्य मैट्रिक्स में आपका डेटा होने पर डेटा.फ्रेम के माध्यम से क्यों जा रहा है?

numpy के लिए मैट्रिक्स पासिंग सीधा है (और यहां तक ​​कि एक प्रतिलिपि बनाने के बिना किया जा सकता है): http://rpy.sourceforge.net/rpy2/doc-2.1/html/numpy.html#from-rpy2-to-numpy

यह दोनों सादगी और दक्षता में फ्लैट फ़ाइलों में संख्यात्मक आंकड़ों की पाठ प्रतिनिधित्व के माध्यम से जा के सुझाव को हरा चाहिए डेटा का आदान-प्रदान करने के तरीके के रूप में।

आप BioConductor वर्गों के साथ काम करने लगता है, और निम्नलिखित में रुचि हो सकती: http://pypi.python.org/pypi/rpy2-bioconductor-extensions/

+0

argh आप सही हैं। यह एक मैट्रिक्स है। यह शानदार है, धन्यवाद। बस इतना समाधान स्पष्ट है, मैं कर सकता हूं: ई = एनपी .array (robjects.r ('exprs (immgen)') और अब ई मेरे सभी फ़्लोटिंग पॉइंट नंबरों के साथ एक numpy सरणी है। धन्यवाद लॉरेन! मुझे बायोसी rpy2 सामान में दिलचस्पी है, लेकिन इसे प्राप्त नहीं कर सकता स्थापित करने के लिए। हालांकि समर्थन सूची के लिए एक सवाल शायद ... –

7

यह सबसे सरल और विश्वसनीय तरीके से मैं अजगर को आर से एक डेटा फ्रेम हस्तांतरण करने के लिए करने के लिए मिल गया है है।

के साथ, मैं आर बाइंडिंग के माध्यम से डेटा का आदान प्रदान लगता है कि शुरू करने के लिए एक अनावश्यक जटिलता है। आर डेटा निर्यात करने के लिए एक आसान तरीका प्रदान करता है, इसी प्रकार, न्यूमपी के पास डेटा आयात के लिए सभ्य तरीके हैं। फ़ाइल प्रारूप यहां आवश्यक एकमात्र आम इंटरफ़ेस है।

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 से कॉलम)।

अंत में, मैंने निर्यात करने से पहले डेटाफ्रेम कारक को पूर्णांक (जो वास्तव में कारक के लिए अंतर्निहित डेटा प्रकार है) में परिवर्तित कर दिया - 'अनक्लास' शायद ऐसा करने का सबसे आसान तरीका है।

आप बड़ा डेटा है (अर्थात, नहीं स्मृति में पूरे डेटा फ़ाइल लोड करना चाहते हैं, लेकिन अभी भी इसे उपयोग करने की जरूरत है) 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[:] 
+1

धन्यवाद डौग! यह वह समाधान है जिसे मैंने भी तय किया था - एकमात्र समस्या यह है कि परिणामी फाइलें + 50 एमबी हैं जो ठीक है, लेकिन एक स्पर्श छद्म लगता है! मैं चाहता हूं कि rpy2 बाइंडिंग्स मुझे एक ऐसा फ़ंक्शन लिखने दें जो 'सरणी, उपनाम, rownames = from_df ("data.frame()" ' –

+1

उस मामले में (बड़ा डेटा) कहता है, मैं केवल NumPy के मेमोरी-मैप किए गए डेटा का उपयोग करूंगा संरचना, रैम में पूरी चीज को लोड करने से बचने के लिए। मेरे उत्तर w/example को संपादित करना – doug

संबंधित मुद्दे