%Rpush>>复杂对象列表(例如IPython Notebook中的pandas DataFrames)

时间:2013-07-06 20:29:06

标签: r ggplot2 ipython ipython-notebook

再一次,我在使用Notebook和新兴的rmagic基础设施方面度过了愉快的时光,但我还有另一个关于两者之间桥梁的问题。目前我正在尝试将pandas DataFrame的几个子集传递给R,以便使用ggplot2进行可视化。为了清楚地说明,我知道我可以传递整个DataFrame并在R中执行其他子集。但是,我的偏好是利用Python的数据管理功能,我正在执行的子集操作更简单快捷使用熊猫比在R中的等效操作。所以为了效率和病态的好奇心......

我一直想弄清楚是否有办法一次推几个物体。皱纹是有时我不知道需要推动多少物品。为了保持灵活性,我一直在脚本的前端使用DataFrame填充字典。下面的代码提供了我正在处理的合理传真(为简单起见,我没有通过com.convert_to_r_dataframe进行转换,但我的实际代码确实采取了这一步骤):

import pandas as pd
from pandas import DataFrame
%load_ext rmagic 

d1=DataFrame(np.arange(16).reshape(4,4))
d2=DataFrame(np.arange(20).reshape(5,4))

d_list=[d1,d2]
names=['n1','n2']

d_dict=dict(zip(names,d_list))

for name in d_dict.keys():
    exec '%s=d_dict[name]' % name

%Rpush n1

可以看出,我可以分配静态名称并将DataFrame单独推送到R命名空间(以及'list'>>%Rpush n1 n2)。我不能做的事情如下:

for name in d_dict.keys():
    %Rpush d_dict[name]

该代码段引发异常>> KeyError:u'd_dict [name]'。我还尝试将动态命名的DataFrames存放在列表中,列表引用最终指向数据而不是对象引用:

df_list=[]
for name in d_dict.keys():
    exec '%s=d_dict[name]' % name
    exec 'df_list.append(%s)' % name

print df_list

for df in df_list:
    %Rpush df

[    0   1   2   3
0   0   1   2   3
1   4   5   6   7
2   8   9  10  11
3  12  13  14  15,     
0   1   2   3
0   0   1   2   3
1   4   5   6   7
2   8   9  10  11
3  12  13  14  15
4  16  17  18  19]
当我遍历列表内容时,

%Rpush没有抛出异常,但是在R名称空间中找不到DataFrame。除了谈论将列表转换为R向量之外,我还没有找到关于这个主题的讨论。任何帮助将不胜感激!

1 个答案:

答案 0 :(得分:2)

Rmagic的推送使用你给它的名称来查找Python变量,并命名它创建的R变量。所以它需要一个有效的名称,而不仅仅是双方的任何表达。

有一个技巧可以从Python变量中获取名称:

d1=DataFrame(np.arange(16).reshape(4,4))
name = 'd1'
%Rpush {name}
# equivalent to %Rpush d1

但是如果你想做更高级的事情,最好抓住r对象并使用它来放置你的对象.Rmagic只是rpy2的一个便利包装器,它是一个完整的API。所以你可以这样做:

from rpy2.robjects import r
r.assign('a', 1)

你可以混合搭配你使用的界面 - rmagic和rpy2正在与R的同一个实例交谈。