设置R公式环境和转换上下文管理器

问题描述

根据Rpy2 documentation,可以使用上下文管理器来实现与Pandas / R之间的转换。但是,应该如何在上下文管理器中设置公式的环境?例如,以下操作失败:

import numpy as np
import pandas as pd
import rpy2.robjects as robjs
import rpy2.robjects.conversion as cv
from rpy2.robjects.packages import importr
from rpy2.robjects import pandas2ri,Formula

r_mass = importr("MASS")
r_stats = importr("stats")

# From MASS dose.p example
ldose = pd.Series(np.concatenate((np.arange(1,6),np.arange(1,6))))
numdead = pd.Series(np.array([1,4,9,13,18,20,2,6,10,12,16]))
sex = pd.Series(np.repeat(["M","F"],[6,6]))
SF = pd.DataFrame(np.column_stack((numdead,20 - numdead)),columns=["numdead","numalive"])
glm_fmla = Formula("SF ~ sex + ldose - 1")


with cv.localconverter(robjs.default_converter + pandas2ri.converter):
    glm_fmla.environment["SF"] = SF
    glm_fmla.environment["sex"] = sex
    glm_fmla.environment["ldose"] = ldose
    budworm_lg0 = robjs.r.glm(glm_fmla,family=r_stats.binomial)

显示以下消息:

RRuntimeError: Error in model.frame.default(formula = SF ~ sex + ldose - 1,drop.unused.levels = TRUE) : 
  invalid type (list) for variable 'SF'

使用rpy2 3.3.6和Linux上的最新R版本。任何指针将不胜感激。

解决方法

类型为RRuntimeError的异常中继错误,以及由R生成的相关消息。在这里,称为(glm()和它调用的其他R代码)的R代码以抱怨{ {1}}是R SF,它是不兼容的类型。

在R中,list个对象继承自data.frame,因此这可能真正表明R代码不像您对因变量那样接受数据。

我们可以检查list的值类型:

SF

转换的目标类型似乎正确。我们将>>> tuple(glm_fmla.environment['SF'].rclass) ('data.frame',) 转换为R pandas.DataFrame

函数data.frame的R示例如下定义MASS::dose.p()

SF

这不是numdead <- c(1,4,9,13,18,20,2,6,10,12,16) SF <- cbind(numdead,numalive = 20 - numdead)

data.frame

您的代码可以这样修改:

> class(SF)
[1] "matrix"

注意:您的示例现在失败了,

r_base = importr('base')
with cv.localconverter(robjs.default_converter + pandas2ri.converter):
    glm_fmla.environment["SF"] = base.as_matrix(SF)
    glm_fmla.environment["sex"] = sex
    glm_fmla.environment["ldose"] = ldose
    budworm_lg0 = robjs.r.glm(glm_fmla,family=r_stats.binomial)

通过确保Error in model.frame.default(formula = SF ~ sex + ldose - 1,drop.unused.levels = TRUE) : variable lengths differ (found for 'ldose') ldose具有相同数量的观察值(10或12),可以轻松地解决它:

SF

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...