等效于rpy2 / dataframe访问的命名列表

乔什·阿德尔

我试图以两种不同的方式从RpyMNP包中复制示例,从rpy2复制首先,我只使用robjects.r一个字符串,该字符串精确复制并粘贴R代码:

import rpy2.robjects as robjects
import rpy2.robjects.numpy2ri
import rpy2.robjects.pandas2ri
import rpy2.robjects.packages as rpackages

robjects.pandas2ri.activate()
mnp = rpackages.importr('MNP')
base = rpackages.importr('base')

r = robjects.r
r.data('detergent')
rcmd = '''\
mnp(choice ~ 1, choiceX = list(Surf=SurfPrice, Tide=TidePrice,
Wisk=WiskPrice, EraPlus=EraPlusPrice,
Solo=SoloPrice, All=AllPrice),
cXnames = "price", data = detergent, n.draws = 500, burnin = 100,
thin = 3, verbose = TRUE)'''

res = r(rcmd)

这可以很好地工作,并再现了我可以直接在R中执行的操作。我还想尝试使用python可访问对象运行此代码,并从数据帧中传入数据:

import rpy2.rlike.container as rlc
df = robjects.pandas2ri.ri2py(r['detergent'])

choiceX = rlc.TaggedList(['SurfPrice', 'TidePrice', 'WiskPrice', 'EraPlusPrice', 'SoloPrice', 'AllPrice'], 
                         tags=('Surf', 'Tide', 'Wisk', 'EraPlus', 'Solo', 'All'))

res = mnp.mnp('choice ~ 1', 
              choiceX=['SurfPrice', 'TidePrice', 'WiskPrice', 'EraPlusPrice', 'SoloPrice', 'AllPrice'],
              cXnames='price', 
              data=df, n_draws=500, burnin=100,
              thin=3, verbose=True)

失败并显示以下错误:

Error in xmatrix.mnp(formula, data = eval.parent(data), choiceX = call$choiceX,  : 
  Error: Invalid input for `choiceX.'
 You must specify the choice-specific varaibles at least for all non-base categories.

在另一个SO响应中建议用rpy2 TaggedList替换R命名列表如果删除MNPchoiceXcXnames参数(它们是可选的),则代码将运行,因此看起来熊猫数据帧已正确传递。

我不确定TaggedList进入R后是否不能正确解释为命名列表,或者MNP是否存在未将其内容choiceX与熊猫数据框相关联的问题

有人对这里可能发生的事情有想法吗?

更新

按照@lgautier的建议,我将代码修改为:

choiceX = rlc.TaggedList([base.as_symbol('SurfPrice'), base.as_symbol('TidePrice'), 
                          base.as_symbol('WiskPrice'), base.as_symbol('EraPlusPrice'), 
                          base.as_symbol('SoloPrice'), base.as_symbol('AllPrice')], 
                         tags=('Surf', 'Tide', 'Wisk', 'EraPlus', 'Solo', 'All'))

res = mnp.mnp(robjects.Formula('choice ~ 1'), 
              choiceX=choiceX,
              cXnames='price', 
              data=df, n_draws=500, burnin=100,
              thin=3, verbose=True)

但是,我得到了与以前发布的相同的错误。

更新2

按照@lgautier建议的解决方法,执行以下代码:

choiceX = rlc.TaggedList([base.as_symbol('SurfPrice'),
                          base.as_symbol('TidePrice'), 
                          base.as_symbol('WiskPrice'),
                          base.as_symbol('EraPlusPrice'), 
                          base.as_symbol('SoloPrice'),
                          base.as_symbol('AllPrice')], 
                         tags=('Surf', 'Tide', 'Wisk',
                               'EraPlus', 'Solo', 'All'))

choiceX = robjects.conversion.py2ro(choiceX)
# add the names
choiceX.names = robjects.vectors.StrVector(('Surf', 'Tide',
                                            'Wisk', 'EraPlus',
                                            'Solo', 'All'))

res = mnp.mnp(robjects.Formula('choice ~ 1'), 
              choiceX=choiceX,
              cXnames='price', 
              data=df, n_draws=500, burnin=100,
              thin=3, verbose=True)

仍然会产生错误(尽管有所不同):

Error in as.vector(x, mode) : 
  cannot coerce type 'symbol' to vector of type 'any'
---------------------------------------------------------------------------
RRuntimeError                             Traceback (most recent call last)
<ipython-input-21-7de5ad805801> in <module>()
      3               cXnames='price',
      4               data=df, n_draws=500, burnin=100,
----> 5               thin=3, verbose=True)

/Users/lev/anaconda/envs/rmnptest/lib/python2.7/site-packages/rpy2-2.5.6-py2.7-macosx-10.5-x86_64.egg/rpy2/robjects/functions.pyc in __call__(self, *args, **kwargs)
    168                 v = kwargs.pop(k)
    169                 kwargs[r_k] = v
--> 170         return super(SignatureTranslatedFunction, self).__call__(*args, **kwargs)
    171 
    172 pattern_link = re.compile(r'\\link\{(.+?)\}')

/Users/lev/anaconda/envs/rmnptest/lib/python2.7/site-packages/rpy2-2.5.6-py2.7-macosx-10.5-x86_64.egg/rpy2/robjects/functions.pyc in __call__(self, *args, **kwargs)
     98         for k, v in kwargs.items():
     99             new_kwargs[k] = conversion.py2ri(v)
--> 100         res = super(Function, self).__call__(*new_args, **new_kwargs)
    101         res = conversion.ri2ro(res)
    102         return res

RRuntimeError: Error in as.vector(x, mode) : 
  cannot coerce type 'symbol' to vector of type 'any'
lgautier

Python代码与您的R不对应。自发布以来就已经弄清楚了,因此请在下面提供详细信息。总结是R符号和Python字符串并不等效(尽管R通过在某些地方允许使用它们(例如,library("MNP")并且library(MNP)都可以使用)使它们自己的用户感到困惑

这与这个问题没有什么不同:pandas和rpy2:为什么ezANOVA通过robjects.r而不是robjects.packages.importr起作用?

...除了那choiceX将是未经评估的R表达式,而不仅仅是符号。

R代码是:

data(detergent)
mnp(choice ~ 1,
    # ^- this is a "formula", which is an expression in R
    choiceX = list(Surf=SurfPrice, Tide=TidePrice,
                   Wisk=WiskPrice, EraPlus=EraPlusPrice,
                   Solo=SoloPrice, All=AllPrice),
    # ^- this is a list of objects, but with the cautionary note
    #    that R evaluates expressions in argument lazily. Therefore
    #    the safest is to have it as an R expression (it may or may
    #    not work if evaluated, but this depends on the code in
    #    `mnp`)
    cXnames = "price",
    # ^- this is a string
    data = detergent,
    n.draws = 500, burnin = 100,
    thin = 3, verbose = TRUE)

您拥有的Python(带有有关差异的注释):

choiceX = rlc.TaggedList(['SurfPrice', 'TidePrice', 'WiskPrice',
                          'EraPlusPrice', 'SoloPrice', 'AllPrice'], 
                         tags=('Surf', 'Tide', 'Wisk',
                               'EraPlus', 'Solo', 'All'))
# ^- this is a "tagged list", and the R equivalent would be
#    list(Surf="SurfPrice", Tide="TidePrice", Wisk="WiskPrice",
#         EraPlus="EraPlusPrice", Solo="SoloPrice", All="AllPrice")
#    Something closer to your R code above would be:
#    rlc.TaggedList([as_symbol('SurfPrice'), as_symbol('TidePrice'),
#                   ...
#                   tags=('Surf', 'Tide', ...))

res = mnp.mnp('choice ~ 1', 
              # ^- this is a string. To make it an R formula, do
              # robjects.Formula('choice ~ 1')
              choiceX=['SurfPrice', 'TidePrice', 'WiskPrice',
                       'EraPlusPrice', 'SoloPrice', 'AllPrice'],
              # ^- this should be choiceX defined above, I guess
              cXnames='price',
              # ^- this is a string, like in R 
              data=df,
              n_draws=500, burnin=100,
              thin=3, verbose=True)

编辑:

现在这意味着以下应该起作用

choiceX = robjects.rinterface.parse("""
    list(Surf=SurfPrice, Tide=TidePrice,
         Wisk=WiskPrice, EraPlus=EraPlusPrice,
         Solo=SoloPrice, All=AllPrice)""")

当前rpy2,R表达式的构建没有提供很多实用程序。如果变量名称是Python级别的参数,则可以考虑以下内容:

rcode = 'list('+''.join('%s=%s' % (k,v) \
                        for k,v in \
                        (('Surf','SurfPrice'),
                         ('Tide', 'TidePrice'),
                         ('Wisk','WiskPrice'),
                         ('EraPlus','EraPlusPrice'),
                         ('Solo','SoloPrice'),
                         ('All','AllPrice'))) + ')'
choiceX = robjects.rinterface.parse(rcode)

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何使用rpy2访问R包的内部功能?

来自分类Dev

通过rpy2将列表从python传递到R

来自分类Dev

通过rpy2将列表从python传递到R

来自分类Dev

将列添加到rpy2中的DataFrame

来自分类Dev

将列添加到rpy2中的DataFrame

来自分类Dev

有没有办法在python / rpy2中访问R数据帧列名?

来自分类Dev

如何将列表传递给rpy2中的R并返回结果

来自分类Dev

使用rpy2从pandas DataFrame的分位数回归模型中的不合格数组

来自分类Dev

使用Rpy2将Pandas DataFrame转换为R数据帧

来自分类Dev

rpy2在python中加载R-dataframe会产生错误的时间戳

来自分类Dev

使用Rpy2将Pandas DataFrame转换为R数据帧

来自分类Dev

等效于Python的列表理解

来自分类Dev

等效于列表理解的地图

来自分类Dev

访问base :: with()内部的未命名列表元素

来自分类Dev

列为命名列表

来自分类Dev

“状态”的命名列表

来自分类Dev

Numpy等效于if / else列表理解

来自分类Dev

查询给定的值列表,等效于sql IN

来自分类Dev

Numpy等效于if / else列表理解

来自分类Dev

查询给定的值列表,等效于sql IN

来自分类Dev

在变量后命名列表

来自分类Dev

rpy2的建筑轮子失败

来自分类Dev

通过rpy2使用Rblpapi

来自分类Dev

rpy2不会将“ _”转换为“”。

来自分类Dev

rpy2不会转换回熊猫

来自分类Dev

用rpy2修改r对象

来自分类Dev

rpy2 zoo 未使用的参数

来自分类Dev

无法从 pycharm 安装 rpy2

来自分类Dev

PHP等效于命名空间[C / C ++]中的枚举