Почему 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 «факторные» объекты - это вектор целых чисел, причем каждое целое число является индексом в соответствующем векторе «уровней». Преобразователь просто вычитает единицу, потому что массивы R индексируются одним индексом, а массивы Python имеют нулевой индекс, но это нарушается всякий раз, когда отсутствуют пропущенные значения (NA), поскольку R использует конкретное целое число для кодирования пропущенных целых чисел (экстремальное значение) и Python, numpy и pandas не имеют эквивалента для этого.
Я открыл проблему , чтобы отследить этот , и тем временем можно обойти эти проблемы, чтобы заменить NA на стороне R на уровень (и назвать их, скажем, «пропавшими» или «NA») измените коэффициенты на массивы строк или измените преобразователь панд для коэффициентов R. Например:
robjects.r("""
SD2011_nofactor <- SD2011 %>%
dplyr::mutate_if(is.factor,
funs(as.character(.))
""")
(Или используйте Python-интерфейс rpy2 для dplyr )
Примечание:
Мало что происходит при выполнении:
robjects.r('SD2011[3, 27]')
- оценивается код R
SD2011[3, 27]
- результат этой оценки проходит преобразование на уровне роботов
- объект, полученный в результате этого преобразования, отображается в вашей записной книжке
Если вы не уверены, обнаружение того, какое из приведенных ниже утверждений Python является первым неудачным, может сказать об этом:
Оценить код R (добавлено TRUE
для предотвращения возврата оценки
x
).
robjects.r('x <- SD2011[3, 27]; TRUE')
Получите объект x
, полученный из приведенной выше оценки, и привяжите его к символу Python (преобразование будет применено).
x = robjects.r('x')
Показать текстовое представление преобразованного объекта
repr(x)