我在Python中使用rpy2包时遇到了一些问题。实际上,我试图通过传递一些参数来调用一个名为upliftRF的函数(位于R中的库"uplift“)。正如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)然后,我得到这个错误:
RRuntimeError: Error in is.data.frame(x) : argument "x" is missing, with no default但是,"x“不是函数的强制参数。
我猜,对于任何其他只有一个参数的R函数来说,这个错误也是一样的,这个参数根本不是强制性的。
感谢您的帮助!
发布于 2016-02-14 02:34:02
import pandas.rpy.common as com
from rpy2.robjects.packages import importr
from rpy2.robjects import pandas2ri
uplift = importr('uplift')接下来,您应该能够使用最常见的方法来调用Python函数,因为importr正在将R函数定义中的命名参数“转换”为语法上有效的Python名称。
dd = uplift.sim_pte(n = 1000, p = 20, rho = 0,
sigma = np.sqrt(2), beta_den = 4)此时,您似乎有一个R data.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和rpy2之间穿梭时坚持使用一种转换方案。在pandas中定义的一致性或在rpy2中定义为consistency across的一致性可能测试较少。错误RRuntimeError: Error: $ operator is invalid for atomic vectors可能来自于此。
pandas的另一种选择是使用表现力极强的R包dplyr。从2.7.0版本开始,rpy2就为它提供了一个定制的接口:
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)https://stackoverflow.com/questions/35332852
复制相似问题