RPY2:data.frameをnumpy配列に変換します
-
28-09-2019 - |
質問
Rにdata.frameがあります。多くのデータが含まれています。多くの(125)アレイの遺伝子発現レベルです。 Pythonのデータは、主にRの無能さと、これが30分間の仕事であるはずだったという事実のために欲しいです。
次のコードを機能させてください。このコードを理解するには、変数を知ってください path
私のデータセットへのフルパスが含まれています。 immgen
. 。ことを知っている immgen
オブジェクトです(バイオコンダクタ ExpressionSet
オブジェクト)そしてそれ exprs(immgen)
125列(実験)と数万の行(遺伝子と名付けられた遺伝子)を持つデータフレームを返します。 (明確ではない場合に備えて、これはRobjects.Rを使用してRコードを呼び出すPythonコードです)
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)よりも多くのものがあり、人生はこれほど簡単ではないかもしれません。しかし、私はまだ変換の実行方法を解決することができません。ドキュメントの見出しについての私の限られた理解は、これが可能であることを意味するものの、ドキュメントは私にとっては少し簡潔です。
誰かが考えますか?
解決
「exprs(mimgen)」がa / matrix /を返すときにdata.frameを実行するのはなぜですか、そしてあなたの最終目標はあなたのデータをマトリックスに置くことですか?
マトリックスをnumpyに渡すことは簡単です(そして、コピーを作成せずに作成することさえできます):http://rpy.sourceforge.net/rpy2/doc-2.1/html/numpy.html#from-rpy2-to-mumpy
これは、データを交換する方法として、フラットファイル内の数値データのテキスト表現を通過するという提案を単純化と効率の両方で打ち負かす必要があります。
あなたはBioconductorクラスを使用しているようで、以下に興味があるかもしれません。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)、各列のタプルの1つのアイテム。列ヘッダーの上を踏む「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[:]