作者:两人浪漫_607 | 来源:互联网 | 2023-09-25 16:22
我需要在Python
中使用Dirichlet回归,而我发现的唯一实现在R
中可用。因此,我想将此R
代码转换为rpy2
表示形式。
library(DirichletReg)
data(ArcticLake)
ArcticLake$Y <- DR_data(ArcticLake[,1:3])
DirichReg(Y ~ depth,data=ArcticLake)
DR_data
函数返回具有属性的矩阵。我不太确定其在R
中的内部表示形式,但是str
使其看起来像列表中的单个项目,而print
使其看起来像是3列的额外集合。>
由于这种特殊性,我无法将上面的代码转换为rpy2
。运行DR_data
函数本身就可以正常工作。
from rpy2.robjects.packages import importr,data
from rpy2.robjects import Formula
from rpy2.robjects import pandas2ri
pandas2ri.activate()
dirichlet_reg = importr("DirichletReg")
arctic_lake = data(dirichlet_reg).fetch("ArcticLake")["ArcticLake"]
dr_arctic = dirichlet_reg.DR_data(pandas2ri.ri2py(arctic_lake).iloc[:,0:3])
不过,我一直在努力为最终分配合适的输出。我试过了,但是最终结构是错误的。
arctic_lake.do_slot_assign("Y",dr_arctic) # arctic_lake$Y <- dr_arctic
fmla = Formula("Y ~ depth")
dirichlet_reg.DirichReg(fmla,data=arctic_lake)
如何使用rpy2
像使用R
一样正确地将矩阵分配给数据框?
我看到R和Python端口之间有两个区别。
添加具有因变量“ y”的列:
我认为.do_slot_assign()
并没有您认为的那样:
>>> from rpy2.robjects.vectors import DataFrame
>>> dataf = DataFrame({'x': 1})
>>> print(dataf)
x
1 1
>>> dataf.do_slot_assign('y',2)
print(dataf)
x
1 1
>>> dataf2 = dataf.cbind(z=3)
>>> print(dataf2)
x z
1 1 3
从R数据框中提取列:
这可能不是问题的根源,但是,为了避免从中取出几列,您将省去将完整的R数据帧转换为熊猫的麻烦。
在R中,您具有:
ArcticLake$Y <- DR_data(ArcticLake[,1:3])
在Python中,您可以:
dr_arctic = dirichlet_reg.DR_data(pandas2ri.ri2py(arctic_lake).iloc[:,0:3])
更接近R原始版本的Python / rpy2
(有关.rx()
-https://rpy2.github.io/doc/v3.2.x/html/vector.html#extracting-r-style的详细信息,请参见此处)
from rpy2.robjects.vectors import IntVector
dr_arctic = dirichlet_reg.DR_data(
arctic_lake.rx(True,IntVector(range(1,3+1)))
)