rpy2 rmagic для ipython, преобразующий тире в точки в именах столбцов dataframe

Я использую rpy2 через rmagic для чередования кода R с кодом python3 в блокноте jupyter. Простая ячейка кода:

%%R -i df -o df_out
df_out <- df

возвращает некоторые измененные имена столбцов, например. CTB-102L5.4 становится CTB.102L5.4. Я думаю, что это связано с read.table или подобным (согласно этому ответу). Однако я не нашел способа указать это в расширении rmagic.

Единственный обходной путь, который я мог придумать, - это изменить имена столбцов перед их передачей в R и вернуть их обратно, когда фрейм данных вернется в python, но я хотел бы найти лучшее решение.


person gc5    schedule 14.03.2018    source источник


Ответы (1)


Всякий раз, когда используется параметр -i <name> для «импорта» объекта Python в R, применяются правила преобразования (см. at=default&fileviewer=file-view-default#rmagic.py-684" rel="nofollow noreferrer">здесь). Преобразователь по умолчанию в конечном итоге вызывает функцию R data.frame, которая очищает имена столбцов (параметр check.names=TRUE по умолчанию, см. https://www.rdocumentation.org/packages/base/versions/3.4.3/topics)./data.frame) на действительные, но не заключенные в кавычки имена символов . В вашем примере CTB-102L5.4 иначе будет проанализировано как выражение CTB - 102L5.4.

Такое поведение по умолчанию не обязательно желательно в каждой ситуации, и в R magic %%R можно передать пользовательский преобразователь.

Документация содержит краткое введение в написание пользовательских правил преобразования (https://rpy2.github.io/doc/v2.9.x/html/robjects_convert.html).

Предполагая, что ваш ввод является pandas DataFrame, вы можете действовать следующим образом:

1- реализовать вариант py2ri_pandasdataframe, который не очищает имена. В идеале просто установите check.names на FALSE, хотя в настоящее время это невозможно из-за https://bitbucket.org/rpy2/rpy2/issues/455/add-parameter-to-dataframe-to-allow).

def my_py2ri_pandasdataframe(obj):
    res = robjects.pandas2ro.py2ri_pandasdataframe(obj)
    # Set the column names in `res` to the original column names in `obj`
    # (left as an exercise for the reader)
    return res

2- создайте собственный конвертер, полученный из конвертера ipython

import pandas
from rpy2.ipython import rmagic
from rpy2.robjects.conversion import Converter, localconverter

my_dataf_converter = Converter('my converter')
my_dataf_converter.py2ri.register(pandas.DataFrame,
                                  my_py2ri_pandasdataframe)

my_converter = rmagic.converter + my_dataf_converter

3- Используйте %%R с --converter=my_converter.

person lgautier    schedule 18.03.2018