'ListSexpVector'的 rpy2 矢量问题 - 关于如何解决的任何想法?



tl;dr -如何修复AttributeError: 'ListSexpVector' object has no attribute 'items'

下面是完整的代码。rpy2的导入对您来说可能略有不同:

import os
os.environ['R_HOME'] = "/Library/Frameworks/R.framework/Resources" 
import rpy2 
import rpy2.robjects as ro
from rpy2.robjects.packages import importr
from rpy2.robjects import pandas2ri, r, numpy2ri 
from rpy2.robjects.conversion import localconverter
pandas2ri.activate()
numpy2ri.activate()

然后创建一个测试数据框架。

import pandas as pd
data = {'status': ['treatment','treatment','control','control'], 
'result': [20,21,19,18]}
df = pd.DataFrame(data)

然后我运行第一个测试代码,它工作了。

with localconverter(ro.default_converter + pandas2ri.converter + numpy2ri.converter): 
r.assign("pydf", df) 
hellow_world = r("""
summary(pydf)        
""") 
print(hellow_world)

我得到正确的R打印出来。哇。:)

但是当我尝试做我真正想做的事情时:

with localconverter(ro.default_converter + pandas2ri.converter + numpy2ri.converter): 
r.assign("pydf", df) 
hellow_world = r("""
t.test(result ~ status, data = pydf)       
""") 
print(hellow_world)

我得到以下错误:

AttributeError: 'ListSexpVector' object has no attribute 'items'

这似乎与rpy2py方法有关,但关于如何修复的任何想法都将非常感谢!

谢谢。主总是拯救我们!

我想你在numpy2ri子模块中遇到了一个bug。你遇到的问题是,本地转换器认为hellow_worldListSexpVector,但它似乎是StrSexpVector对象,而不是(基于我的快速调试)。我对numpy2ri模块还不太了解,无法确切地知道这是如何发生的,但这里有一个解决方案:

如果你只想打印R消息

r.assign("pydf", df) 
hellow_world = r("""
t.test(result ~ status, data = pydf)       
""") 
print(hellow_world)

你根本不需要转换器。

如果你想用Python解析R消息

r.assign("pydf", df) 
hellow_world = r("""
t.test(result ~ status, data = pydf)       
""") 
with localconverter(ro.default_converter + pandas2ri.converter + numpy2ri.converter): 
print(list(hellow_world))

如果没有localconverter上下文,hellow_world = r(...行返回一个原始R对象,而不会触发错误的转换。然后,在转换上下文中将hellow_world转换为Python列表将触发函数式的逐列表项转换。生成的列表阅读起来要困难得多,但它是一个带有str和numpy对象的Python列表。

相关内容

最新更新