2

繰り返しになりますが、私は Notebook と新しい rmagic インフラストラクチャで素晴らしい時間を過ごしていますが、2 つの間の架け橋について別の質問があります。現在、ggplot2 で視覚化するために、pandas DataFrame のいくつかのサブセットを R に渡そうとしています。前もって明確にしておくと、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 名前空間にプッシュできます (「リスト」 >> %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 ベクトルへの変換に関する話以外に、このトピックに関する多くの議論を見つけることができませんでした。どんな助けでも大歓迎です!

4

1 に答える 1

2

Rmagic のプッシュは、Python 変数を検索するためと、作成する R 変数に名前を付けるために、指定した名前を使用します。したがって、式だけでなく、両側に有効なnameが必要です。

Python 変数から名前を取得するためにできるトリックがあります。

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

しかし、より高度なことをしたい場合は、オブジェクトを取得し、それrを使用してオブジェクトを配置するのが最善です。Rmagic は、完全な API である rpy2 の便利なラッパーです。したがって、次のことができます。

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

使用するインターフェースを組み合わせることができます.rmagicとrpy2はRの同じインスタンスと通信しています.

于 2013-07-07T23:35:58.160 に答える