【问题标题】:trouble with rpy2, rpart passing data correctly from python to rrpy2出现问题,rpart将数据正确地从python传递到r
【发布时间】:2010-12-14 00:20:37
【问题描述】:

我正在尝试使用 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)

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

公式如下:

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

【问题讨论】:

  • R 中的数据框是列表。也许您应该将数组传递给数组或矩阵?
  • 我尝试传递矩阵,但这也引发了错误。有趣的是,如果我用 r.plsr 代替 r.rpart,它可以正常工作,并且 rpart 和 plsr 都说他们想要数据作为 data.frame....

标签: python r rpy2


【解决方案1】:

问题与 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())

)。

解决此问题的一种方法是避免输入该代码块(见下文),或者可能是从 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))

【讨论】:

  • 您的答案很完美,解决方案也很完美。非常感谢!我正在为这个而烦恼。
猜你喜欢
  • 1970-01-01
  • 2013-11-13
  • 1970-01-01
  • 2017-11-26
  • 2020-01-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-08
相关资源
最近更新 更多