我正在使用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时将其恢复原状,但我想找到更好的解决方案。
答案 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
一起使用。