等價於R中命名列表的自然Python是字典,但RPy2爲您提供ListVector對象。將RPy2 ListVector轉換爲Python字典
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更好的方法或東西,我應該使用?
不錯!字典(zip(...方法不處理嵌套列表(我的第二個例子),但它簡單得多,我喜歡它。 – cbare
是否可以在'DataFrame'做到這一點是安全的那麼? –
這個版本是否有更新? –