2010-12-14 53 views
0

J'essaie d'exécuter Rpart à travers RPY2 en utilisant Python 2.6.5 et R 10.0.problème avec rpy2, Rpart passage des données correctement de python à r

créer un cadre de données en python et le transmettre, mais je reçois une erreur indiquant:

Error in function (x) : binary operation on non-conformable arrays 
Traceback (most recent call last): 
    File "partitioningSANDBOX.py", line 86, in <module> 
    model=r.rpart(**rpart_params) 
    File "build/bdist.macosx-10.3-fat/egg/rpy2/robjects/functions.py", line 83, in __call__ 
    File "build/bdist.macosx-10.3-fat/egg/rpy2/robjects/functions.py", line 35, in __call__ 
rpy2.rinterface.RRuntimeError: Error in function (x) : binary operation on non-conformable arrays 

Quelqu'un peut-il me aider à déterminer ce que je fais de mal à jeter cette erreur?

la partie pertinente de mon code est la suivante:

import numpy as np 
import rpy2 
import rpy2.robjects as rob 
import rpy2.robjects.numpy2ri 


#Fire up the interface to R 
r = rob.r 
r.library("rpart") 

datadict = dict(zip(['responsev','predictorv'],[cLogEC,csplitData])) 
Rdata = r['data.frame'](**datadict) 
Rformula = r['as.formula']('responsev ~.') 
#Generate an RPART model in R. 
Rpcontrol = r['rpart.control'](minsplit=10, xval=10) 
rpart_params = {'formula' : Rformula, \ 
     'data' : Rdata, 
     'control' : Rpcontrol} 
model=r.rpart(**rpart_params) 

Les deux variables cLogEC et csplitData sont des tableaux numpy de type flottant.

En outre, mon cadre de données ressemble à ceci:

In [2]: print Rdata 
------> print(Rdata) 
    responsev predictorv 
1 0.6020600  312 
2 0.3010300  300 
3 0.4771213  303 
4 0.4771213  249 
5 0.9242793  239 
6 1.1986571  297 
7 0.7075702  287 
8 1.8115750  270 
9 0.6020600  296 
10 1.3856063  248 
11 0.6127839  295 
12 0.3010300  283 
13 1.1931246  345 
14 0.3010300  270 
15 0.3010300  251 
16 0.3010300  246 
17 0.3010300  273 
18 0.7075702  252 
19 0.4771213  252 
20 0.9294189  223 
21 0.6127839  252 
22 0.7075702  267 
23 0.9294189  252 
24 0.3010300  378 
25 0.3010300  282 

et la formule ressemble à ceci:

In [3]: print Rformula 
------> print(Rformula) 
responsev ~ . 
+0

Les données dans R sont des listes. Peut-être que vous devriez passer des tableaux à des tableaux ou des matrices? –

+0

J'ai essayé de passer des matrices mais cela a aussi généré une erreur. Fait intéressant, si je remplace r.plsr pour r.rpart, cela fonctionne bien et à la fois rpart et plsr disent qu'ils veulent des données sous forme de data.frame ... – mishaF

Répondre

5

Le problème est lié à R Code idiosyncratique dans rpart (pour être précis, la bloc suivant, en particulier la dernière ligne:

m <- match.call(expand.dots = FALSE) 
m$model <- m$method <- m$control <- NULL 
m$x <- m$y <- m$parms <- m$... <- NULL 
m$cost <- NULL 
m$na.action <- na.action 
m[[1L]] <- as.name("model.frame") 
m <- eval(m, parent.frame()) 

). Une façon de contourner cela est d'éviter d'entrer ce bloc de code (voir ci-dessous) ou de construire une évaluation imbriquée à partir de Python (de sorte que parent.frame() se comporte). Ce n'est pas aussi simple qu'on pourrait l'espérer, mais peut-être que je trouverai le temps de le rendre plus facile à l'avenir.

from rpy2.robjects import DataFrame, Formula 
import rpy2.robjects.numpy2ri as npr 
import numpy as np 
from rpy2.robjects.packages import importr 
rpart = importr('rpart') 
stats = importr('stats') 

cLogEC = np.random.uniform(size=10) 
csplitData = np.array(range(10), 'i') 

dataf = DataFrame({'responsev': cLogEC, 
        'predictorv': csplitData}) 
formula = Formula('responsev ~.') 
rpart.rpart(formula=formula, data=dataf, 
      control=rpart.rpart_control(minsplit = 10, xval = 10), 
      model = stats.model_frame(formula, data=dataf)) 
+0

votre réponse était parfaite et la solution a fonctionné parfaitement. Merci beaucoup! Je tirais mes cheveux à propos de celui-ci. – mishaF