如何在 rpy2 中使用 R 'with' 运算符
How to use the R 'with' operator in rpy2
我正在做序数逻辑回归,并按照此处的指南进行分析:R Data Analysis Examples: Ordinal Logistic Regression
我的数据框(咨询)看起来像:
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 是序数 运行ked 分数,其值介于 0 - 4 之间;n 是整数;raingarden 和 consult_case,二进制值为 0 或 1)
我有 sf 功能:
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))
主要问题是 R with
运算符被视为 python 关键字,因此即使我使用 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
我当然可以在 R 中完成这一切,但我在 python 中有一个非常复杂的 ETL 脚本,因此我更愿意使用 rpy2 将所有内容保留在 python 中(我确实尝试过这个使用 mord 进行 scipy-学习 运行 我的回归,但它非常原始)。
现在欢迎任何建议。
编辑
我尝试了@Parfait 的各种建议组合,根据 PyCharm 解释器(请参阅末尾带有红色突出显示的图像),限定 fun
参数在语法上是不正确的: 。 .. 限定符是什么也没关系,我总是会出错
SyntaxError: keyword can't be an expression.
另一方面,没有限定符,没有语法错误:,但我在使用函数 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")
考虑到这一点,我用函数 sf
在 R 中创建了一个包,将其导入,并尝试了各种组合,唯一没有产生错误的组合是:print(base._with(consult_case_control, R.summary(formula, fun=gms.sf)))
(gms 是对我在 R 中的包的引用)。
虽然输出没有意义:
Length Class Mode
3 formula call
我期待 UCLA 网站上的 table ala。有趣的。我将尝试在 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 的统计包 as.formula
从字符串构建。另请注意,由于命名冲突而进行了另一种翻译:
stats = importr('stats', robject_translations={'format_perc': '_format_perc'})
formula = stats.as_formula('es_score ~ n + raingarden + consult_case')
我正在做序数逻辑回归,并按照此处的指南进行分析:R Data Analysis Examples: Ordinal Logistic Regression
我的数据框(咨询)看起来像:
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 是序数 运行ked 分数,其值介于 0 - 4 之间;n 是整数;raingarden 和 consult_case,二进制值为 0 或 1)
我有 sf 功能:
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))
主要问题是 R with
运算符被视为 python 关键字,因此即使我使用 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
我当然可以在 R 中完成这一切,但我在 python 中有一个非常复杂的 ETL 脚本,因此我更愿意使用 rpy2 将所有内容保留在 python 中(我确实尝试过这个使用 mord 进行 scipy-学习 运行 我的回归,但它非常原始)。
现在欢迎任何建议。
编辑
我尝试了@Parfait 的各种建议组合,根据 PyCharm 解释器(请参阅末尾带有红色突出显示的图像),限定 fun
参数在语法上是不正确的: SyntaxError: keyword can't be an expression.
另一方面,没有限定符,没有语法错误: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")
考虑到这一点,我用函数 sf
在 R 中创建了一个包,将其导入,并尝试了各种组合,唯一没有产生错误的组合是:print(base._with(consult_case_control, R.summary(formula, fun=gms.sf)))
(gms 是对我在 R 中的包的引用)。
虽然输出没有意义:
Length Class Mode
3 formula call
我期待 UCLA 网站上的 table ala。有趣的。我将尝试在 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 的统计包 as.formula
从字符串构建。另请注意,由于命名冲突而进行了另一种翻译:
stats = importr('stats', robject_translations={'format_perc': '_format_perc'})
formula = stats.as_formula('es_score ~ n + raingarden + consult_case')