【问题标题】:non-conformable arrays when passing numpy array to R via rpy2通过 rpy2 将 numpy 数组传递给 R 时的不一致数组
【发布时间】:2015-06-09 02:13:31
【问题描述】:

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

【问题讨论】:

    标签: python r rpy2


    【解决方案1】:

    看起来这是一个错误,如果我使用现在已弃用的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 产生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]
    

    当数据向量为Array 而不是FloatVector 时,gamlss 似乎引发了异常。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-02-19
      • 2020-06-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多