热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

使用rpy2将矩阵添加到数据框

我需要在Python中使用Dirichlet回归,而我发现的唯一实现在R中可用

我需要在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)))
)

推荐阅读
author-avatar
两人浪漫_607
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有