为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

波斯汪 2021-03-23 13:09:57
我有以下字典的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.3333 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:太多值无法解压我认为有许多不同的技术可以实现这一目标,而rpy2和Python中的大量数据结构使我感到困惑。
查看完整描述

2 回答

?
暮色呼如

TA贡献1853条经验 获得超9个赞

当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)


查看完整回答
反对 回复 2021-03-30
?
BIG阳

TA贡献1859条经验 获得超6个赞

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


在Python中:


df = robjects.DataFrame(obs[0])

for ob in obs[1:]:

    df = df.rbind(robjects.DataFrame(ob))

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


查看完整回答
反对 回复 2021-03-30
  • 2 回答
  • 0 关注
  • 337 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信