通过rpy2将numpy数组传递给R时的不兼容数组问题

2024-09-30 18:21:11 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图将一个numpy数组传递给R中的GAMLSS包

import numpy as np
import rpy2.robjects as robjects
from rpy2.robjects import numpy2ri
numpy2ri.activate()
r = robjects.r
r.library("gamlss")
r.library("gamlss.mx")

L = r['data.frame'](np.array(np.random.normal(size=1000), 
                             dtype=([('x', np.float), ('y', np.float), ('z', np.float)])))
r.gamlssMX(robjects.Formula('z~1'), data=L)

运行此返回

^{pr2}$

但是我可以把数据帧传递给线性模型R函数。在

lm = r.lm(robjects.Formula('x~y'), data=L)
print r.summary(lm.rx())

我有一堆代码可以读取Python中的二进制文件,但是我希望使用R包,因此需要rpy2。在

--编辑--

以R为例:

x <- data.frame(z=c(rnorm(1000), rnorm(1000, mean=4)))
gamlssMX(z~1, K=1, data=x)

Tags: importnumpydataasnplibraryfloatframe
1条回答
网友
1楼 · 发布于 2024-09-30 18:21:11

看起来是个bug,如果我使用现在折旧的pandas.rpy.common.convert_to_r_dataframe,它工作得很好:

但当前首选的方法会产生错误:

import numpy as np
import rpy2.robjects as robjects
from rpy2.robjects import pandas2ri
import pandas.rpy.common as com

robjects.reval("library('gamlss')")
robjects.reval("library('gamlss.mx')")

R =pd.DataFrame({'x': np.random.random(2000)})
A1 = pandas2ri.pandas2ri(R)
A2 = com.convert_to_r_dataframe(R)
robjects.r.assign('B1', A1)
robjects.r.assign('B2', A2)
robjects.reval("m <- gamlssMX(x~1, K=1, data=B1)") #won't work
robjects.reval("m <- gamlssMX(x~1, K=1, data=B2)") #works fine

只有一行区别:使用com.convert_to_r_dataframepandas2ri.pandas2ri。看起来当前版本有一个bug。在

新的pandas2ri.pandas2ri方法产生rpy2.robjects.vectors.Array,旧的com.convert_to_r_dataframe产生{}。在

^{pr2}$

当数据向量是gamlss而不是FloatVector时,gamlss会引发异常。在

相关问题 更多 >