rpy2 rmagic for ipython将破折号转换为数据框列名称中的点

时间:2018-03-14 15:49:50

标签: python r ipython jupyter rpy2

我正在使用rpy2通过rmagic在一个jupyter笔记本中将R代码与python3代码交错。这是一个简单的代码单元:

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

返回一些已更改的列名称,例如CTB-102L5.4变为CTB.102L5.4。我认为这与read.table或类似相关(根据this answer)。但是我没有找到在rmagic扩展中指定它的方法。

我能想到的唯一解决方法是在将列名称传递给R之前更改列名称,并在数据帧返回python时将其恢复原状,但我想找到更好的解决方案。

1 个答案:

答案 0 :(得分:1)

每次使用参数-i <name>到&#34;导入&#34;将一个Python对象导入R,应用转换规则(参见here)。默认转换器最终调用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一起使用。