RPY2、RPARTがPythonからRへのデータを正しく渡す問題
質問
Python 2.6.5とR 10.0を使用して、RPY2を介してRPARTを実行しようとしています。
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)
2つの変数CrogecとcsplitDataは、フロートタイプの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 ~ .
解決
問題は、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))
所属していません StackOverflow