2010-12-14 4 views
0

파이썬 2.6.5 및 R 10.0을 사용하여 RPY2를 통해 rpart를 실행하려고합니다. rpy2, rpart에서 파이썬에서 r으로 올바르게 데이터를 전달하는 데 문제가 있습니다

나는 파이썬에서 데이터 프레임을 만들고 함께 전달할하지만 오류가 나타 얻을 :

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는 플로트 타입의 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 

및 화학식은 다음과 같다 :

또한 내 데이터 프레임은 다음과 같다

문제가 rpart에서 R 특이한 코드 관련된
In [3]: print Rformula 
------> print(Rformula) 
responsev ~ . 
+0

R의 데이터 프레임은 목록입니다. 어쩌면 당신은 배열이나 행렬에 배열을 전달해야합니까? –

+0

나는 행렬을 전달하려고 시도했지만 오류가 발생했습니다. 흥미롭게도 r.plsr을 r.rpart로 대체하면 rpart와 plsr 모두 데이터가 data.frame ...으로 표시되기를 원합니다. – mishaF

답변

5

(정확하려면 다음 블록, 특히 마지막 라인 :

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

).

이 문제를 해결하는 한 가지 방법은 해당 코드 블록을 입력하는 것을 피하는 것 (아래 참조)이거나 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

관련 문제