【问题标题】:rpy2 object not found errorrpy2对象未找到错误
【发布时间】:2013-02-20 02:20:30
【问题描述】:

我正在尝试使用 rpy2 让我在 python 中使用一些 r 功能。这是我想做的一个简单的回归。我创建了一个数据框,将其转换为 R 数据框,然后尝试使用 R 的 lm。但是找不到 R 数据框(见下文)。我应该在哪里进行故障排除?

仅供参考,我使用的是 python 2.7.3、rpy2-2.3.2、pandas 版本“0.10.1”和 R2.15.3

>>> import rpy2
>>> import pandas as pd
>>> import pandas.rpy.common as com
>>> datframe = pd.DataFrame({'a' : [1, 2, 3], 'b' : [3, 4, 5]})
>>> r_df = com.convert_to_r_dataframe(datframe)
>>> r_df     
(DataFrame - Python:0x32547e8 / R:0x345d640)
[IntVector, IntVector]
  a: (class 'rpy2.robjects.vectors.IntVector')
  (IntVector - Python:0x3254e18 / R:0x345d608)
[       1,        2,        3]
  b: (class 'rpy2.robjects.vectors.IntVector')
  (IntVector - Python:0x3254e60 / R:0x345d5d0)
[       3,        4,        5]
>>> print type(r_df)
(class 'rpy2.robjects.vectors.DataFrame')
>>> from rpy2.robjects import r
>>> r('lmout <- lm(r_df$a ~ r_df$b)')

Error in eval(expr, envir, enclos) : object 'r_df' not found
Traceback (most recent call last):
  File "<pyshell#8>", line 1, in <module>
    r('lmout <- lm(r_df$a ~ r_df$b)')
  File "/usr/local/lib/python2.7/dist-packages/rpy2/robjects/__init__.py", line 236, in __call__
    res = self.eval(p)
  File "/usr/local/lib/python2.7/dist-packages/rpy2/robjects/functions.py", line 86, in __call__
    return super(SignatureTranslatedFunction, self).__call__(*args, **kwargs)
  File "/usr/local/lib/python2.7/dist-packages/rpy2/robjects/functions.py", line 35, in __call__
    res = super(Function, self).__call__(*new_args, **new_kwargs)
RRuntimeError: Error in eval(expr, envir, enclos) : object 'r_df' not found

【问题讨论】:

    标签: python r dataframe pandas rpy2


    【解决方案1】:

    打电话时

    r('lmout <- lm(r_df$a ~ r_df$b)')
    

    嵌入式 R 将查找变量 r_df,并且在您的代码示例中,没有此类变量对 R 可见。

    什么时候做

    r_df = com.convert_to_r_dataframe(datframe)
    

    您正在 Python 端创建变量 r_df,但是虽然实际数据现在在 R 中,但 R 没有任何符号(名称)与之关联。该数据结构保持匿名。 (顺便说一句,您可能希望使用 rpy2-2.3.3 附带的 pandas 数据帧的自动转换)。

    要在 R 的“全局环境”中创建变量名,请添加:

    from rpy2.robjects import globalenv
    globalenv['r_df'] = r_df
    

    现在你的lm() 电话应该可以工作了。

    【讨论】:

    • 谢谢。我尝试了这种方法,因为它似乎最容易实现并且有效。现在正在努力从 lmout 中获取信息!
    • r('print(summary(lmout))') 工作得很好。 print(r('print(summary(lmout))') ) 效果更好。
    • 您是否查看了 rpy2 的文档? rpy.sourceforge.net/rpy2/doc-dev/html/…
    • 我当然做到了 :-) (我知道你在我的出现之前写了一点评论...)谢谢。
    【解决方案2】:

    请注意,对于简单的回归,您可以完全在 Python 中完成,使用 ols from statsmodels:

    from statsmodels.formula.api import ols
    
    lmout = ols('a ~ b', datframe).fit()
    lmout.summary()
    

    【讨论】:

    • 谢谢。我知道这一点。我只是在探索python。
    【解决方案3】:

    试试这个,(虽然不确定哪个标头有魔力....)

    import rpy2.robjects as robjects
    from rpy2.robjects import DataFrame, Formula
    import rpy2.robjects.numpy2ri as npr
    import numpy as np
    from rpy2.robjects.packages import importr
    
    
    def my_linear_fit_using_r(X,Y,verbose=True):
       # ## FITTINGS:   RPy implementation ###
       r_correlation = robjects.r('function(x,y) cor.test(x,y)')
       # r_quadfit = robjects.r('function(x,y) lm(y~I(x)+I(x^2))')
       r_linfit = robjects.r('function(x,y) lm(y~x)')
       r_get_r2=robjects.r('function(x) summary(x)$r.squared')
       lin=r_linfit(robjects.FloatVector(X),robjects.FloatVector(Y))
       coef_lin=robjects.r.coef(lin)
       a=coef_lin[0]
       b=coef_lin[1]
       r2=r_get_r2(lin)
       ci=robjects.r.confint(lin) # confidence intervals
       lwr_a=ci[0]
       lwr_b=ci[1]
       upr_a=ci[2]
       upr_b=ci[3]
       if verbose:
          print robjects.r.summary(lin)
          # print robjects.r.summary(quad)
       return (a,b,r2[0],lwr_a,upr_a,lwr_b,upr_b)
    

    【讨论】:

    • 感谢您的建议。看起来值得一试,但我走的是下一个建议中概述的简短而简单的懒惰路线。
    猜你喜欢
    • 2017-08-26
    • 2013-11-25
    • 2018-12-18
    • 2017-12-27
    • 2016-08-05
    • 1970-01-01
    • 2013-06-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多