2

次のような辞書の Python リストがあります (sqlite3 行ファクトリから取得)。

obs = [{'ave': 0.027, 'pap': 0.277}, 
{'ave': 0.29, 'pap': 0.333}, 
{'ave': 0.25, 'pap': 0.5}]

rpy2これを(バージョン2.3.6)で使用するためにR data.frameに変換したいので、このようになります

    ave   pap  

1 0.027 0.277 
2 0.29  0.333
3 0.25  0.5

次のように、単一の「行」を data.frame に変換できます。

robjects.DataFrame(obs[0])

    ave   pap 

1 0.027 0.277 

使用robjects.DataFrame(obs)しても機能しません... ValueError: obj は反復可能なクラスのインスタンス (Python dict、rpy2.rlike.container OrdDict など) またはタイプ VECSXP の rpy2.rinterface.SexpVector のインスタンスのいずれかです

また、使用して OrdDict に変換しようとしましrpy2.rlike.container.OrdDict(obs)たが、 ValueError: too many values to unpack を取得しました

これを実現するにはさまざまな手法があると思いますが、rpy2 と Python の両方にある多数のデータ構造が私を混乱させます。

4

2 に答える 2

4

[質問と受け入れられた回答の両方への回答]

R データ フレームを作成して追加すると、obs が大きくなるとパフォーマンスの問題が発生します。これに対処する 1 つの方法は、Python で結果を「転置」することです。

# "transpose" the data structure in Python
from collections import defaultdict
d = defaultdict(list)
for row in obs:
    for colname in row:
        d[colname].append(row[colname])

# Assuming that all data are floats
# (if not the case a mapping between SQLite3 types and R vector types is needed)
for rpy2.robjects.vectors import FloatVector
for colname in d:
    d[colname] = FloatVector(d[colname])

# data frame
from rpy2.robjects import DataFrame
dataf = DataFrame(d)
于 2013-08-15T10:39:55.867 に答える