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

标签 r ggplot2 ipython jupyter-notebook

我再次在 Notebook 和新兴的 rmagic 基础设施方面度过了一段愉快的时光,但我对两者之间的桥梁还有另一个问题。目前,我正在尝试将 pandas DataFrame 的几个子集传递给 R,以便使用 ggplot2 进行可视化。预先说明一下,我知道我可以传递整个 DataFrame 并在 R 中执行额外的子集设置。但是,我的偏好是利用 Python 的数据管理功能,并且我正在执行的子集操作更容易、更快使用 pandas 比使用 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 命名空间中(以及“列表”>> %Rpush n1 n2 中)。我不能做的是类似以下的事情:

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

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

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 向量的转换之外,我找不到关于这个主题的太多讨论。任何帮助将不胜感激!

最佳答案

Rmagic 的推送使用您为其指定的名称来查找 Python 变量并命名它创建的 R 变量。因此,它两侧都需要一个有效的名称,而不仅仅是任何表达式。

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

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

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

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

您可以混合搭配您使用的接口(interface) - rmagic 和 rpy2 正在与同一个 R 实例通信。

关于r - %Rpush >> 复杂对象列表(例如 IPython Notebook 中的 pandas DataFrames),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17506839/

相关文章:

r - 为 R 中的每个级别选择前 80 个观察值

r - ggplot2完全自定义图例?

r - 分组数据并绘制多条线

mysql - 在.bash_profile中已经设置了路径但仍然得到 '-bash: mysql: command not found'

python - %timeit 和变量的重新赋值

r - 将 SPSS 编写的小数据集转换为 CSV

r - t.首先通过子集化测试分组因素的所有组合

r - 计算子字符串中特定字符的数量

r - 在 R 中使用facet_grid 将 Kruskal Wallis p 值添加到箱线图中时出错

python - 如何知道ipython下运行的是哪个python?