首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在rpy2中调用R函数时出现错误-“缺少参数”

在rpy2中调用R函数时出现错误-“缺少参数”
EN

Stack Overflow用户
提问于 2016-02-11 15:07:33
回答 1查看 548关注 0票数 0

我在Python中使用rpy2包时遇到了一些问题。实际上,我试图通过传递一些参数来调用一个名为upliftRF的函数(位于R中的库"uplift“)。正如https://cran.r-project.org/web/packages/uplift/uplift.pdf的第27页所述,函数的参数之一可以是x,也可以是描述基于数据帧(参数中的“data”参数)拟合的模型的公式。在R中执行第29页的代码时,一切都运行得很顺利。但是,我在rpy2中遇到了一些问题。下面是我的代码:

代码语言:javascript
复制
import pandas.rpy.common as com
from rpy2.robjects.packages import importr
from rpy2.robjects import pandas2ri
uplift = importr('uplift')
kwargs = {'n': 1000, 'p' : 20, 'rho' : 0, 'sigma' : np.sqrt(2), 'beta.den': 4}
dd = uplift.sim_pte(**kwargs)
ddPD = pandas2ri.ri2py(dd)
ddPD['treat'] = [1 if x==1 else 0 for x in ddPD['treat']]
dd = com.convert_to_r_dataframe(ddPD) 
kwargs2 = {'formula':'y ~ X1 + X2 + X3 + X4 + X5 + X6 + trt(treat)',
         'mtry':3,'ntree':200,'split_method':'KL','minsplit':200,'data':dd}

fit1 = uplift.upliftRF(**kwargs2)

然后,我得到这个错误:

代码语言:javascript
复制
RRuntimeError: Error in is.data.frame(x) : argument "x" is missing, with no default

但是,"x“不是函数的强制参数。

我猜,对于任何其他只有一个参数的R函数来说,这个错误也是一样的,这个参数根本不是强制性的。

感谢您的帮助!

EN

回答 1

Stack Overflow用户

发布于 2016-02-14 02:34:02

代码语言:javascript
复制
import pandas.rpy.common as com
from rpy2.robjects.packages import importr
from rpy2.robjects import pandas2ri
uplift = importr('uplift')

接下来,您应该能够使用最常见的方法来调用Python函数,因为importr正在将R函数定义中的命名参数“转换”为语法上有效的Python名称。

代码语言:javascript
复制
dd = uplift.sim_pte(n = 1000, p = 20, rho = 0,
                    sigma = np.sqrt(2), beta_den = 4)

此时,您似乎有一个R data.frame。转到pandas添加一列,然后返回R,这绝对是可能的:

代码语言:javascript
复制
ddPD = pandas2ri.ri2py(dd) 
ddPD['treat'] = [1 if x==1 else 0 for x in ddPD['treat']]
dd = com.convert_to_r_dataframe(ddPD)

但是,除非有很好的理由,否则我建议在pandasrpy2之间穿梭时坚持使用一种转换方案。在pandas中定义的一致性或在rpy2中定义为consistency across的一致性可能测试较少。错误RRuntimeError: Error: $ operator is invalid for atomic vectors可能来自于此。

pandas的另一种选择是使用表现力极强的R包dplyr。从2.7.0版本开始,rpy2就为它提供了一个定制的接口:

代码语言:javascript
复制
from rpy2.robjects.lib import dplyr
dd = (dplyr.DataFrame(dd)
      .mutate(treat = 'ifelse(treat==1, 1, 0)')

在您的回答中已经指出,公式应该这样声明(公式在R中是语言对象,但在Python中没有语言级别的等价物)。在将此代码编写为常见的Python调用时:

代码语言:javascript
复制
fit1 = uplift.upliftRF(formula = robjects.Formula('y ~ X1 + X2 + X3 + X4 + X5 + X6 + trt(treat)'),
                       mtry = 3,
                       ntree = 200,
                       split_method = 'KL',
                       minsplit = 200,
                       data = dd)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35332852

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档