Rpy2:如何将字典列表转换为R数据帧

时间:2013-06-05 10:02:51

标签: python r dictionary rpy2

我有一个Python列表的字典如下(来自sqlite3行工厂):

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

我想将此转换为R data.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 dict,rpy2.rlike.container OrdDict或rpy2.rinterface.SexpVector的实例)类型VECSXP

我还尝试使用rpy2.rlike.container.OrdDict(obs)将其转换为OrdDict,但得到了ValueError:要解压的值太多

我认为有很多不同的技术可以实现这一点,而rpy2和Python中的众多数据结构让我感到困惑。

2 个答案:

答案 0 :(得分: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)

答案 1 :(得分:1)

我实际上找到了一个答案(这可能不是最有效但对我有用的):

在Python中:

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

如果某人有更好,更优雅,更有效的解决方案,欢迎他/她发布。