2010-12-14 23 views
0

Python 2.6.5とR 10.0を使用してrpartをRPY2で実行しようとしています。rpy2でrpartが正しくpythonからrにデータを渡す

私はPythonでデータフレームを作成し、一緒にそれを渡すが、私はというエラーを取得:

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 

を誰も私は、私はこのエラーをスローするように間違ってやっているものを判断するのに役立つことができますか?

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) 

二つの変数cLogECとcsplitDataは、float型のnumpyの配列です:

私のコードの関連部分はこれです。

また、私のデータフレームは、次のようになります。

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 

式は次のようになります

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

Rのデータフレームはリストです。配列を配列や行列に渡す必要がありますか? –

+0

私は行列を渡そうとしましたが、それもエラーを投げました。興味深いことに、r.plsrをr.rpartに置き換えると、rpartとplsrの両方がdata.frameとしてデータを必要としていると言います。 – mishaF

答えて

5

問題がRPARTでR特有のコードに関連している(正確には、次のブロック、特に最後の行:

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()) 

)。

これを回避する方法の1つは、そのコードブロックを入力することを避けることです(下記参照)。または、Pythonからネストされた評価を構築することができます(parent.frame()が動作するように)。これは、希望どおりに単純ではありませんが、今後、より簡単にするための時間を見つけることができます。

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

あなたの答えは完璧で、ソリューションは完璧に機能しました。とても感謝しています!私はこのことについて私の髪を引っ張っていた。 – mishaF

関連する問題