我正在尝试Rpy2,感觉非常难过。我传递了我的熊猫数据框并使用
运行混合效果模型m_rt = lme4.lmer(formula,verbose=True)
out = r.ranef(m_rt)
如果我打印出来,它看起来像预期的那样:
$cat
(Intercept) gen delta
x 0.093546331 -0.168458284 0.144213098
y -0.082592717 0.148733010 -0.127326764
z 0.005229467 -0.009417228 0.008061863
现在我想将这些信息传回pandas数据框。或者真的,我可以使用的任何python对象!我试过了pandas2ri.ri2py(out)
并得到了
<ListVector - Python:0x118b53248 / R:0x7fe3663a3238>
[DataFrame]
<ListVector - Python:0x118b53248 / R:0x7fe3663a3238>
[DataFrame]
和r.data.frame(out)
并获得AttributeError: 'SignatureTranslatedFunction' object has no attribute 'frame'
。我无法安装dplyr,因为它与pandas数据帧定义有些冲突 - 也许这就是原因。这是正常的吗?下面的错误:
LibraryError: Conflict when converting R symbols in the package "dplyr" to Python symbols:
-obj_type_data_frame -> obj_type.data_frame, obj_type.data.frame
To turn this exception into a simple warning use the parameter `on_conflict="warn"\`
任何帮助非常感谢!谢谢!
答案 0 :(得分:2)
好的,这比我做的更容易。我一直在使用here
中的模板from rpy2.robjects import pandas2ri
pandas2ri.activate()
r_df = pandas2ri.py2ri(p_df)
# add all the fields to an environment
env = Environment()
for varname in r.colnames(r_df):
env[varname] = r_df(varname)
formula = Formula('x ~ gen + delta + ( 1 + gen + delta | cat )',
environment=env)
m_rt = lme4.lmer(formula,verbose=True)
从那里可以print r.summary(m_rt)
和print r.fixef(m_rt)
,但无法获得更多工作。
但更简单的方法(我在jupyter笔记本中),是:
%load_ext rpy2.ipython
%Rpush p_df
(下一个单元格)
%%R
library(lme4)
m_rt <- lmer(x ~ gen + delta + ( 1 + gen + delta | cat ) ),
data = p_df)
rfs <- ranef(m_rt)$cat
ffs <- fixef(m_rt)
(下一个单元格)
%Rpull rfs
%Rpull ifs
瞧,rfs现在是一个pandas数据框,而ffs是一个数组。
答案 1 :(得分:1)
错误消息正在尝试帮助您:
要将此异常转换为简单警告,请使用参数
on_conflict="warn"\
按照建议操作,您可以导入dplyr
:
dplyr = importr("dplyr", on_conflict="warn")
这就是in rpy2's own wrapper for dplyr所做的。
在此期间,如果对dplyr
感兴趣(这是covered in the doc),您可能想要使用该包装器。
答案 2 :(得分:0)
我遇到了同样的问题,我相信您看到“ out”作为R对象的情况如下:
R类,其类:('ranef.mer',)映射到:[ListSexpVector] 组:
我的解决方案是像这样通过python数据帧访问它:
出[0] re_campaign [0]