当前位置: 代码迷 >> python >> 如何在rpy2中使用R'with'运算符
  详细解决方案

如何在rpy2中使用R'with'运算符

热度:18   发布时间:2023-06-13 13:55:45.0

我正在执行序数逻辑回归,并按照此处的指导进行分析:

我的数据框(咨询)如下所示:

           n  raingarden  es_score  consult_case
garden_id                                       
27436      7           0         3             0
27437      1           0         0             1
27439      1           1         1             1
37253      1           0         3             0
37256      3           0         0             0

我需要在R中使用以下命令来创建图以测试比例赔率假设:

(s <- with(dat, summary(es_score ~ n + raingarden + consult_case, fun=sf)))

(es_score是序数排序得分,其值介于0到4之间; n是整数; raingarden和consult_case,二进制值为0或1)

我有科幻功能:

sf <- function(y) {
     c('Y>=1' = qlogis(mean(y >= 1)),
       'Y>=2' = qlogis(mean(y >= 2)),
       'Y>=3' = qlogis(mean(y >= 3)))
}

在我访问的utils.r文件中,如下所示:

from rpy2.robjects.packages import STAP
with open('/file_path/utils.r', 'r') as f:
    string = f.read()
sf = STAP(string, "sf")

并希望采取以下措施:

R = ro.r
R.with(work_case_control, R.summary(formula, fun=sf))

主要问题是with操作符的R被视为python关键字,因此即使我使用ro.r.with访问它, ro.r.with被识别为python关键字。 (作为旁注:我尝试使用R的apply方法,但收到TypeError: 'SignatureTranslatedAnonymousPackage' object is not callable ……我假设这是指我的函数sf ?)

我还尝试在rpy2中使用R分配方法,如下所示:

R('sf = function(y) { c(\'Y>=1\' = qlogis(mean(y >= 1)), \'Y>=2\' = qlogis(mean(y >= 2)), \'Y>=3\' = qlogis(mean(y >= 3)))}')

R('s <- with({0}, summary(es_score~raingarden + consult_case, fun=sf)'.format(consult))

但遇到数据RRuntimeError: Error in (function (file = "", n = NULL, text = NULL, prompt = "?", keep.source = getOption("keep.source"), : <text>:1:19: unexpected symbol 1: s <- with( n raingarden列名以某种方式导致错误的问题: RRuntimeError: Error in (function (file = "", n = NULL, text = NULL, prompt = "?", keep.source = getOption("keep.source"), : <text>:1:19: unexpected symbol 1: s <- with( n raingarden

我当然可以在R中完成所有操作,但是我在python中有一个非常参与的ETL脚本,因此宁愿使用rpy2将所有内容保留在python中(我确实使用mord来进行scipy-learn来运行我的答辩,但是它非常原始)。

任何建议现在都将受到欢迎。

编辑

我尝试了@Parfait的建议的各种组合,并且根据PyCharm解释器,限定fun参数在语法上是不正确的(请参见带有红色突出显示的图像): ...不管是什么限定词,我总是会收到一个错误消息, SyntaxError: keyword can't be an expression.

另一方面,没有限定符,则没有语法错误: ,但我确实收到错误TypeError: 'SignatureTranslatedAnonymousPackage' object is not callable使用获得的函数sf时, TypeError: 'SignatureTranslatedAnonymousPackage' object is not callable

from rpy2.robjects.packages import STAP with open('/Users/gregsilverman/development/python/rest_api/rest_api/scripts/utils.r', 'r') as f: string = f.read() sf = STAP(string, "sf")

考虑到这一点,我在R中使用函数sf创建了一个程序包,将其导入,然后尝试了多种组合,唯一的组合不会产生错误,即: print(base._with(consult_case_control, R.summary(formula, fun=gms.sf))) (gms是对RI中的软件包的引用)。

输出虽然没有意义:

Length Class Mode 3 formula call

我希望UCLA网站上有一张桌子。 有趣。 我将尝试在R中重新创建我的分析,仅出于此目的。 我仍然想在python中完成它。

考虑将with调用括起来,并确保限定所有参数,包括fun

ro.r['with'](work_case_control, ro.r.summary(formula, ro.r.summary.fun=sf))

或者,导入R的基本包。 为了避免与Python的具名方法with()冲突,请翻译R名称:

from rpy2.robjects.packages import importr

base = importr('base', robject_translations={'with': '_with'})

base._with(work_case_control, ro.r.summary(formula, ro.r.summary.fun=sf))

并确保正确创建您的公式。 考虑使用R的stats软件包的as.formula从字符串构建。 注意,由于命名冲突,还会进行另一种翻译:

stats = importr('stats', robject_translations={'format_perc': '_format_perc'})

formula = stats.as_formula('es_score ~ n + raingarden + consult_case')