7

R に data.frame があります。多くの (125) 配列からの遺伝子発現レベルなど、多くのデータが含まれています。主に R での私の無能さと、これが 30 分の仕事になるはずだったという事実のために、私は Python のデータが欲しいです。

次のコードを機能させたいと思います。このコードを理解するには、変数pathにデータ セットへのフル パスが含まれていることを知っておいてください。このデータ セットをロードすると、 という変数が得られますimmgenimmgenそれがオブジェクト (BioconductorExpressionSetオブジェクト) であり、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を表していたとしても、それが配列に直接変換されないことは十分に公平です-データフレームには配列(行名と列名)よりも多くのものが含まれているため、人生はこれほど簡単ではないはずです. ただし、変換を実行する方法はまだわかりません。ドキュメントは私には少し簡潔すぎますが、ドキュメントの見出しの理解が限られているため、これが可能であることを示唆しています。

誰でも何か考えはありますか?

4

2 に答える 2

7

これは、データ フレームを 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が推奨される方法です。

データ型のタプル (引数はdtypes ) をloadtxtに渡すこともできます。各列のタプルに 1 つの項目があります。'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[:]
于 2010-04-19T18:32:01.093 に答える
4

'exprs(immgen)'が/ matrix /を返し、最終目標がデータを行列に含めることであるのに、なぜdata.frameを通過するのですか?

マトリックスをnumpyに渡すのは簡単です(コピーを作成せずに作成することもできます): http: //rpy.sourceforge.net/rpy2/doc-2.1/html/numpy.html#from-rpy2-to-numpy

これは、データを交換する方法としてフラットファイル内の数値データのテキスト表現を通過するという提案を単純さと効率の両方で打ち負かすはずです。

あなたはバイオコンダクタークラスを使用しているようで、次のことに興味があるかもしれません:http: //pypi.python.org/pypi/rpy2-bioconductor-extensions/

于 2010-04-20T08:19:46.353 に答える