设置 R 公式环境和转换上下文管理器
Setting up R formulae environments and conversion context managers
根据Rpy2 documentation,上下文管理器可以用来实现转换to/from 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, 0, 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 版本。任何指针将不胜感激。
由 R 生成的 RRuntimeError
中继错误类型及其相关消息的异常。这里调用的 R 代码(glm()
和它调用的其他 R 代码)以抱怨值结束因为 SF
是一个 R list
并且这是一个不兼容的类型。
在 R 中,data.frame
对象继承自 list
,因此这可能真正表明 R 代码不接受像因变量那样的数据。
我们可以检查 SF
:
值的类型
>>> tuple(glm_fmla.environment['SF'].rclass)
('data.frame',)
转换的目标类型似乎是正确的。我们将 pandas.DataFrame
转换为 R data.frame
.
函数 MASS::dose.p()
的 R 示例定义 SF
如下:
numdead <- c(1, 4, 9, 13, 18, 20, 0, 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
和 SF
具有相同数量的观察值(10 或 12)来轻松修复它:
>>> len(ldose)
10
>>> SF.shape
(12, 2)
根据Rpy2 documentation,上下文管理器可以用来实现转换to/from 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, 0, 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 版本。任何指针将不胜感激。
由 R 生成的 RRuntimeError
中继错误类型及其相关消息的异常。这里调用的 R 代码(glm()
和它调用的其他 R 代码)以抱怨值结束因为 SF
是一个 R list
并且这是一个不兼容的类型。
在 R 中,data.frame
对象继承自 list
,因此这可能真正表明 R 代码不接受像因变量那样的数据。
我们可以检查 SF
:
>>> tuple(glm_fmla.environment['SF'].rclass)
('data.frame',)
转换的目标类型似乎是正确的。我们将 pandas.DataFrame
转换为 R data.frame
.
函数 MASS::dose.p()
的 R 示例定义 SF
如下:
numdead <- c(1, 4, 9, 13, 18, 20, 0, 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
和 SF
具有相同数量的观察值(10 或 12)来轻松修复它:
>>> len(ldose)
10
>>> SF.shape
(12, 2)