2015-06-09 3 views
2

Я пытаюсь передать Numpy массив пакета GAMLSS в R., не созвучные массивы при переходе Numpy массива R через rpy2

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.

- EDIT -

В качестве примера в R:

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

ответ

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_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.

Смежные вопросы