2013-06-05 54 views
2

我有字典的Python列表如下(從sqlite3的排廠推出):Rpy2:如何詞典列表轉換爲R數據幀

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

我想這個轉換爲R數據.frame爲了與rpy2(版本2.3.6)使用它,所以它看起來像這樣

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可以是iter-able類的實例(例如Python字典,rpy2.rlike.container OrdDict或類型爲VECSXP的rpy2.rinterface.SexpVector的實例

我也試着將其轉換爲使用rpy2.rlike.container.OrdDict(obs)的OrdDict卻得到了ValueError異常:值過多解壓

我認爲有很多不同的技術來實現這一點,和數據結構的兩個rpy2衆人和Python使我困惑。

回答

1

其實,我找到了答案(這可能不是最有效的,但確實爲我的事):

在Python:

df = robjects.DataFrame(obs[0]) 
for ob in obs[1:]: 
    df = df.rbind(robjects.DataFrame(ob)) 

如果有人有一個更好的,更優雅,更高效解決方案,歡迎他/她發佈。

4

[在回答這兩個問題和接受的答案]

創建R數據幀,並追加他們會造成性能問題時,OBS變大。 解決此問題的一種方法是在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)