在rpy2中调用R函数错误“缺少参数”

2024-06-16 13:40:24 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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)

然后,我得到一个错误:

^{pr2}$

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

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

谢谢你的帮助!在


Tags: 函数代码fromimportcomdata参数packages
1条回答
网友
1楼 · 发布于 2024-06-16 13:40:24
import pandas.rpy.common as com
from rpy2.robjects.packages import importr
from rpy2.robjects import pandas2ri
uplift = importr('uplift')

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

^{pr2}$

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

ddPD = pandas2ri.ri2py(dd) 
ddPD['treat'] = [1 if x==1 else 0 for x in ddPD['treat']]
dd = com.convert_to_r_dataframe(ddPD)

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

pandas的另一种选择是使用非常有表现力的R包dplyrrpy2自2.7.0版起为其提供定制的接口:

from rpy2.robjects.lib import dplyr
dd = (dplyr.DataFrame(dd)
      .mutate(treat = 'ifelse(treat==1, 1, 0)')

你的回答中已经指出,公式应该 声明为(公式是R中的语言对象,但是 在Python语言级别没有对等的语言)。写这个的时候 作为一个常见的Python调用:

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)

相关问题 更多 >