在使用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
不处理这个优雅?
这里是我的笔记本电脑通过它运行。
为什么不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]')
- 将R代码
SD2011[3, 27]
进行评价 - 这一评估结果正在经历robjects电平转换
- 从该变换后的对象在笔记本中示出
如果不确定,发现其下面的Python语句之一是第一次失败可以告诉它:
评估将R代码(所添加的TRUE
是为了防止从评价返回x
)。
robjects.r('x <- SD2011[3, 27]; TRUE')
取对象x
从上述评价得到并将其绑定到一个Python符号(转换将应用。查阅全文)。
x = robjects.r('x')
显示转换后的对象的文本表示
repr(x)
文章来源: “ValueError: codes need to be between -1 and len(categories)-1” when extracting null values in rpy2