在rpy2中提取空值时,“ ValueError:代码必须介于-1和len(类别)-1之间”

时间:2018-11-10 06:27:53

标签: python r rpy2

在将java.util.Locale.UKShort Date 12/08/2018 Formatted Date Sunday, August 12, 2018 R包(rpy2)中的内置数据集一起使用时,出现以下错误:

synthpop

我将问题深入到具有空条目的列中,例如这样做时会收到相同的错误,但相邻行或列却没有:

SD2011

我确认这是一个空值,

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

为什么robjects.r('SD2011[3, 27]') 无法正常处理?

Here's my notebook贯穿其中。

1 个答案:

答案 0 :(得分:1)

  

为什么rpy2无法正常处理?

这似乎是在将R因子转换为带有2.9.x版本的rpy2的熊猫的过程中触发的错误(开发分支default,将来的3.0.x版本没有此问题)。具体在执行以下操作:

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

R个“因数”对象是整数向量,每个整数都是“级别”的关联向量中的索引。转换器只是减去一个,因为R数组是一个索引,而Python数组是零索引,但是只要有缺失值(NA)就会中断,因为R使用特定的整数来编码缺失的整数(一个极值),并且Python,numpy和pandas对此没有等效功能。

我打开了一个issue to track this,同时,解决方法是将R侧的NA替换为一个水平(并称其为“缺失”或“ NA”),将因子更改为字符串数组,或修改R因子的熊猫转换器。例如:

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

(或使用rpy2's Pythonic interface to dplyr

注意:

在执行操作时很少成功发生:

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)