我正在尝试将一个 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_dataframe
或 pandas2ri.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/