python - 将 RPy2 ListVector 转换为 Python 字典

标签 python rpy2

自然的 Python 等价于 R 中的命名列表是一个字典,但是 RPy2给你一个ListVector对象。

import rpy2.robjects as robjects

a = robjects.r('list(foo="barbat", fizz=123)')

此时,a 是 ListVector对象。

<ListVector - Python:0x108f92a28 / R:0x7febcba86ff0>
[StrVector, FloatVector]
  foo: <class 'rpy2.robjects.vectors.StrVector'>
  <StrVector - Python:0x108f92638 / R:0x7febce0ae0d8>
[str]
  fizz: <class 'rpy2.robjects.vectors.FloatVector'>
  <FloatVector - Python:0x10ac38fc8 / R:0x7febce0ae108>
[123.000000]

我想要的是可以像普通 Python 字典一样对待的东西。我的临时解决办法是这样的:

def as_dict(vector):
    """Convert an RPy2 ListVector to a Python dict"""
    result = {}
    for i, name in enumerate(vector.names):
        if isinstance(vector[i], robjects.ListVector):
            result[name] = as_dict(vector[i])
        elif len(vector[i]) == 1:
            result[name] = vector[i][0]
        else:
            result[name] = vector[i]
    return result

as_dict(a)
{'foo': 'barbat', 'fizz': 123.0}

b = robjects.r('list(foo=list(bar=1, bat=c("one","two")), fizz=c(123,345))')
as_dict(b)
{'fizz': <FloatVector - Python:0x108f7e950 / R:0x7febcba86b90>
 [123.000000, 345.000000],
 'foo': {'bar': 1.0, 'bat': <StrVector - Python:0x108f7edd0 / R:0x7febcba86ea0>
  [str, str]}}

所以,问题是...有没有更好的方法或我应该使用的 RPy2 内置的东西?

最佳答案

我认为将r向量放入dictionary不必那么复杂,这样怎么样:

In [290]:

dict(zip(a.names, list(a)))
Out[290]:
{'fizz': <FloatVector - Python:0x08AD50A8 / R:0x10A67DE8>
[123.000000],
 'foo': <StrVector - Python:0x08AD5030 / R:0x10B72458>
['barbat']}
In [291]:

dict(zip(a.names, map(list,list(a))))
Out[291]:
{'fizz': [123.0], 'foo': ['barbat']}

当然,如果您不介意使用 pandas,那就更简单了。结果将有 numpy.array 而不是 list,但在大多数情况下都可以:

In [294]:

import pandas.rpy.common as com
com.convert_robj(a)
Out[294]:
{'fizz': [123.0], 'foo': array(['barbat'], dtype=object)}

关于python - 将 RPy2 ListVector 转换为 Python 字典,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24152160/

相关文章:

python - 为 super 用户以外的用户排除 Django 管理中的字段

python - numpy : Get the element of array which contains True on comparions

python - 在 spacy 中执行 noun_chunks (或在 textblob 中执行 np_extractor )时,如何添加一些我已经知道的名词短语?

python - 特拉维斯 CI : error when installing rpy2

python - 根据不同数据帧中的值,用数据帧中的 float 替换字符串

python - 在 `python` 上运行 R 代码,语法错误 : keyword can't be an expression error Message

python - rpy2 导入不起作用

python - 安装 pywin32 - win32api.pyd 权限被拒绝

python - 多处理和 rpy2(使用 ape)

python - Amazon EC2 实例上的 pyvirtualdisplay