-->

“ValueError异常:代码需要是-1和len(类别)之间-1”提取rpy2空值时(“Value

2019-10-31 07:11发布

在使用rpy2从内置的数据集synthpop [R包( SD2011 ),我得到这个错误:

robjects.r('head(SD2011)')
# ...
# ValueError: codes need to be between -1 and len(categories)-1

我钻下来的问题转化为具有空条目列,如我这样做时,你得到同样的错误,而不是相邻的行或列:

robjects.r('SD2011[3, 27]')

我证实这是一个空值:

robjects.r('is.na(SD2011[, 27])')
# array([0, 0, 1, ..., 0, 0, 0], dtype=int32)

为什么rpy2不处理这个优雅?

这里是我的笔记本电脑通过它运行。

Answer 1:

为什么不rpy2处理这个优雅?

这似乎是在R因子与rpy2版本2.9.x到熊猫的转换过程中引发的错误(在Dev分支default ,未来的3.0.x的,没有这个问题)。 特别是当这样做的:

res = pandas.Categorical.from_codes(numpy.asarray(obj) - 1,
                                    categories = obj.do_slot('levels'),
                                    ordered = 'ordered' in obj.rclass)

R“因子”的对象是整数的向量,其中每个整数在“级别”的相关联的向量的索引。 该转换器被简单地减去之一,因为ř阵列被一个索引和Python阵列是零指数,但只要有丢失,因为R的使用特定的整数进行编码缺少整数(一个极端的值)值(NAS)这是打破和Python中,numpy的,而大熊猫不具备此等价。

我开了一个问题跟踪此并在此期间,解决方法可以取代在NAS上的R侧的水平(和给他们打电话,说,“丢失”或“NA”),改变的因素,以字符串数组,或修改大熊猫转换器对于R的因素。 例如:

robjects.r("""
  SD2011_nofactor <- SD2011 %>%
    dplyr::mutate_if(is.factor,
                     funs(as.character(.))
""")

(或使用rpy2的Python的接口dplyr )

注意:

时做几件事情发生succcessively:

robjects.r('SD2011[3, 27]')
  1. 将R代码SD2011[3, 27]进行评价
  2. 这一评估结果正在经历robjects电平转换
  3. 从该变换后的对象在笔记本中示出

如果不确定,发现其下面的Python语句之一是第一次失败可以告诉它:

  1. 评估将R代码(所添加的TRUE是为了防止从评价返回x )。

     robjects.r('x <- SD2011[3, 27]; TRUE') 
  2. 取对象x从上述评价得到并将其绑定到一个Python符号(转换将应用。查阅全文)。

     x = robjects.r('x') 
  3. 显示转换后的对象的文本表示

     repr(x) 


文章来源: “ValueError: codes need to be between -1 and len(categories)-1” when extracting null values in rpy2
标签: python r rpy2