[英]Rpy2: How to convert list of dictionaries to R data frame
我有以下字典的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可以是可迭代类的实例(例如Python dict,rpy2.rlike.container OrdDict或类型为rpy2.rinterface.SexpVector的实例) VECSXP
我也尝试使用rpy2.rlike.container.OrdDict(obs)
将其转换为OrdDict,但出现ValueError:太多值无法解压
我认为有许多不同的技术可以实现这一目标,而rpy2和Python中的大量数据结构使我感到困惑。
[回答问题和接受的答案]
当obs变得更大时,创建R数据帧并附加它们将导致性能问题。 解决此问题的一种方法是在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)
我实际上找到了一个答案(这可能不是最有效的,但却为我做的事情):
在Python中:
df = robjects.DataFrame(obs[0])
for ob in obs[1:]:
df = df.rbind(robjects.DataFrame(ob))
如果有人有更好,更优雅,更有效的解决方案,欢迎他/她发布。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.