python - 通过 rpy2 将 numpy 数组传递给 R 时不一致的数组

标签 python r rpy2

我正在尝试将一个 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)

运行此返回

Error in y0 - f0 : non-conformable arrays

但我可以将数据框传递给线性模型 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)

最佳答案

看起来这是一个错误,如果我使用现在已贬值的 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。看起来当前版本有错误。

较新的 pandas2ri.pandas2ri 方法产生 rpy2.robjects.vectors.Array 而旧的 com.convert_to_r_dataframe 产生 rpy2.robjects.vectors.FloatVector

In [3]:

robjects.r.B1
Out[3]:
<DataFrame - Python:0x10e868a28 / R:0x10f425238>
[Array]
  x: <class 'rpy2.robjects.vectors.Array'>
  <Array - Python:0x10e868b48 / R:0x10f425400>
[0.051728, 0.149642, 0.884797, ..., 0.485063, 0.733193, 0.134963]
In [4]:

robjects.r.B2
Out[4]:
<DataFrame - Python:0x10e868cf8 / R:0x110e1b918>
[FloatVector]
  x: <class 'rpy2.robjects.vectors.FloatVector'>
  <FloatVector - Python:0x10e868e18 / R:0x10f442400>
[0.051728, 0.149642, 0.884797, ..., 0.485063, 0.733193, 0.134963]

看起来 gamlss 在数据向量是 Array 而不是 FloatVector 时引发异常。

关于python - 通过 rpy2 将 numpy 数组传递给 R 时不一致的数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30721952/

相关文章:

python - Spark 流 : read CSV string from kafka, 写入 Parquet

r - 如何仅向外缓冲一组具有公共(public)边的多边形(从边缘,而不是内部 "frontiers")

python - 将高维 R 数据集加载到 Pandas DataFrame

python - Jupyter notebook 中的 !ls (Python 3)

python - 计算字符串中字符出现的次数

python - 如何根据线性回归结果绘制S形曲线?

r - 在 R 中获取环境标识符

r - Travis-CI 中的测试错误超过 13 最后一行

python - 将向量和参数从 Python 传递到 R 函数

python - Rpy2 & ggplot2 : LookupError 'print.ggplot'