2013-02-01 78 views
12

我想使用熊猫进行所有分析,并使用numpy,但使用Rpy2绘制数据。我想用熊猫数据框做所有的分析,然后用rpy2绘制完整的R来绘制这些图。 py2,并使用ipython来绘图。什么是正确的方法来做到这一点?如何在Rpy2中使用熊猫数据框和numpy数组?

几乎所有我尝试的命令都失败了。例如:

  • 我想绘制一个熊猫DataFrame的两列之间的分散点df。我希望df的标签在x/y轴上使用,就像使用R数据框一样。有没有办法做到这一点?当我试着使用r.plot做到这一点,我得到这个杂乱的情节:

In: r.plot(df.a, df.b) # df is pandas DataFrame

产量:

Out: rpy2.rinterface.NULL

导致剧情:

enter image description here

就像你c一看,轴标签被搞乱了,它并不像它应该那样从DataFrame读取轴标签(X轴是a的列df,而Y轴是列b)。

  • 如果我努力使与r.hist直方图,它不会在所有的工作,产生了错误:

    In: r.hist(df.a) 
    Out: 
    ... 
    vectors.pyc in <genexpr>((x,)) 
        293   if l < 7: 
        294    s = '[' + \ 
    --> 295     ', '.join((p_str(x, max_width = math.floor(52/l)) for x in self[ : 8])) +\ 
        296     ']' 
        297   else: 
    
    vectors.pyc in p_str(x, max_width) 
        287      res = x 
        288     else: 
    --> 289      res = "%s..." % (str(x[ : (max_width - 3)])) 
        290    return res 
        291 
    
    TypeError: slice indices must be integers or None or have an __index__ method 
    

,并导致该地块:

enter image description here

任何想法错误是什么意思?再一次,这些轴都乱成一团,乱七八糟的乱七八糟的数据。

编辑:仅当使用ipython时才会发生此错误。当我从脚本运行命令时,它仍会产生有问题的情节,但至少运行时没有错误。从ipython中调用这些命令肯定有问题。

  • 我也试图大熊猫数据帧df转换的R数据框所推荐的下面的海报,但这个错误也失败:

    com.convert_to_r_dataframe(mydf) # mydf is a pandas DataFrame 
    ----> 1 com.convert_to_r_dataframe(mydf) 
    in convert_to_r_dataframe(df, strings_as_factors) 
        275  # FIXME: This doesn't handle MultiIndex 
        276 
    --> 277  for column in df: 
        278   value = df[column] 
        279   value_type = value.dtype.type 
    
    TypeError: iteration over non-sequence 
    

我怎样才能得到这些在Pandas DataFrame上工作的基本绘图功能(从Pandas DataFrame的标签中读取绘图标签),并且还可以在Pandas DF到R DF之间进行转换,以便正常工作?

EDIT2:下面是一个csv文件“test”的完整示例。TXT”(http://pastebin.ca/2311928)和我的代码来回答@戴尔的评论:

import rpy2 
from rpy2.robjects import r 
import rpy2.robjects.numpy2ri 
import pandas.rpy.common as com 
from rpy2.robjects.packages import importr 
from rpy2.robjects.lib import grid 
from rpy2.robjects.lib import ggplot2 
rpy2.robjects.numpy2ri.activate() 
from numpy import * 
import scipy 

# load up pandas df 
import pandas 
data = pandas.read_table("./test.txt") 
# plotting a column fails 
print "data.c2: ", data.c2 
r.plot(data.c2) 
# Conversion and then plotting also fails 
r_df = com.convert_to_r_dataframe(data) 
r.plot(r_df) 

调用绘制的列‘data.c2’失败,即使data.c2是大熊猫DF的一列,因此对于所有意图和目的应该是一个numpy的数组。我用的是activate()电话,所以我想它会处理这列作为numpy的阵列和绘制。

第二次调用转换后绘制数据框data的R数据框也为什么会这样?如果我从R加载test.txt作为数据框,我能够plot()它,并且由于我的数据帧已从熊猫转换为R,它看起来就像它也应该在这里工作。

当我在ipython中尝试rmagic时,由于某种原因它不会启动绘图窗口,尽管它没有错误。即如果我这样做:

In [12]: X = np.array([0,1,2,3,4]) 

In [13]: Y = np.array([3,5,4,6,7]) 
In [14]: import rpy2 

In [15]: from rpy2.robjects import r 

In [16]: import rpy2.robjects.numpy2ri 

In [17]: import pandas.rpy.common as com 

In [18]: from rpy2.robjects.packages import importr 

In [19]: from rpy2.robjects.lib import grid 

In [20]: from rpy2.robjects.lib import ggplot2 


In [21]: rpy2.robjects.numpy2ri.activate() 

In [22]: from numpy import * 

In [23]: import scipy 

In [24]: r.assign("x", X) 
Out[24]: 
<Array - Python:0x592ad88/R:0x6110850> 
[  0,  1,  2,  3,  4] 

In [25]: r.assign("y", Y) 
<Array - Python:0x592f5f0/R:0x61109b8> 
[  3,  5,  4,  6,  7] 

In [27]: %R plot(x,y) 

没有错误,但没有图窗口。无论如何,我想坚持使用rpy2,如果可能的话,不要依赖rmagic

谢谢。

+0

可以导出CSV导入和背部或使用RPY – locojay

+0

@locojay:如何使用RPY与大熊猫数据帧? – user248237dfsf

+0

看看http://rpy.sourceforge.net/rpy/doc/rpy_html/DataFrame-class.html它使用std python ds ...采用同样的方法,使用pandas df – locojay

回答

7

[注:您在 “编辑2” 的代码在这里工作(Python 2.7版,rpy2-2.3.2,R-1.15.2)。]

由于@dale只要R对象是匿名的(即对象不存在R符号),R deparse(substitute())将最终返回R对象的structure(),并且可能的解决方法是指定“xlab”和“ylab”参数;对于一些情节,你还必须指定main(标题)。

解决该问题的另一种方法是使用R的公式并输入数据框(在我们计算出转换部分后,更多地在下面)。

忘记pandas.rpy是什么。它已经被破解,似乎忽略了rpy2中可用的功能。

较早的quick fix to conversion with ipython可以很容易地变成正确的转换。我正在考虑在rpy2代码库中添加一个(带有更多的花里胡哨),但同时在代码示例中的所有导入之后添加下面的代码片段。无论何时进行R调用,它都会将熊猫的DataFrame对象透明地转换为rpy2的DataFrame。现在

from collections import OrderedDict 
py2ri_orig = rpy2.robjects.conversion.py2ri 
def conversion_pydataframe(obj): 
    if isinstance(obj, pandas.core.frame.DataFrame): 
     od = OrderedDict() 
     for name, values in obj.iteritems(): 
      if values.dtype.kind == 'O': 
       od[name] = rpy2.robjects.vectors.StrVector(values) 
      else: 
       od[name] = rpy2.robjects.conversion.py2ri(values) 
     return rpy2.robjects.vectors.DataFrame(od) 
    elif isinstance(obj, pandas.core.series.Series): 
     # converted as a numpy array 
     res = py2ri_orig(obj) 
     # "index" is equivalent to "names" in R 
     if obj.ndim == 1: 
      res.names = ListVector({'x': ro.conversion.py2ri(obj.index)}) 
     else: 
      res.dimnames = ListVector(ro.conversion.py2ri(obj.index)) 
     return res 
    else: 
     return py2ri_orig(obj) 
rpy2.robjects.conversion.py2ri = conversion_pydataframe 

下面的代码将 “只是工作”:

r.plot(rpy2.robjects.Formula('c3~c2'), data) 
# `data` was converted to an rpy2 data.frame on the fly 
# and the a scatter plot c3 vs c2 (with "c2" and "c3" the labels on 
# the "x" axis and "y" axis). 

我也注意到,您正在导入ggplot2,不使用它。目前转换 将不得不明确要求。例如:

p = ggplot2.ggplot(rpy2.robjects.conversion.py2ri(data)) +\ 
    ggplot2.geom_histogram(ggplot2.aes_string(x = 'c3')) 
p.plot() 
+0

您的代码不适用于我 - 这里是我的完整示例及其输出http://pastebin.com/index/tAFG7dUV - 它现在抱怨数据类型'系列'不可转换。有任何想法吗? – user248237dfsf

+0

如果我添加'activate()'它可以工作,但是当我尝试使用长数据框时,plot.window(...)中的错误'rpy2.rinterface.RRuntimeError:Error:需要有限的'xlim'值'。它从不适用于任何实际的数据帧。 – user248237dfsf

+0

我必须只查看第一个引起错误的列,并在我修复该列时继续前进。错误消息告诉rpy2不知道如何转换类“pandas.core.series.Series”的对象。 elif isinstance(obj,pandas.core.series.Series):'else:'之前'和转换代码可以微不足道地修复它。由于熊猫数据帧的转换现在是rpy2代码库的一部分(将在2.3.3版中发布),现在这是一个错误报告(https://bitbucket.org/lgautier/rpy2/issue/118/converion-of-熊猫系列缺失)。 – lgautier

5

使用rpy。转换是大熊猫的一部分,所以你不需要做yoursef http://pandas.pydata.org/pandas-docs/dev/r_interface.html

In [1217]: from pandas import DataFrame 

In [1218]: df = DataFrame({'A': [1, 2, 3], 'B': [4, 5, 6], 'C':[7,8,9]}, 
    ......:    index=["one", "two", "three"]) 
    ......: 

In [1219]: r_dataframe = com.convert_to_r_dataframe(df) 

In [1220]: print type(r_dataframe) 
<class 'rpy2.robjects.vectors.DataFrame'> 
+3

我们在0.10.1中添加了导出能力在HDFStore中,以便rhdf5可以读取 - 请参阅http://pandas.pydata.org/pandas-docs/stable/io.html#external-compatibility – Jeff

+0

这实际上不起作用...我得到:''275# FIXME:这不处理多索引 - > 277对于df中的列: 278 value = df [column] 279 value_type = value.dtype.type'' – user248237dfsf

+0

@Jeff:转换不起作用,事实证明,即使最基本的rpy2调用R也不起作用,请参阅上述编辑 – user248237dfsf

6

调用r.plot功能时,您需要在标签传递明确。

r.plot([1,2,3],[1,2,3], xlab="X", ylab="Y") 

当R中的情节时,它将通过deparse(substitute(x))基本上抓住从plot(testX, testY)变量名称的标签。当你在Python对象通过rpy2传递,它是一个匿名[R对象,类似于R中的以下内容:

> deparse(substitute(c(1,2,3))) 
[1] "c(1, 2, 3)" 

这就是为什么你得到了疯狂的标签。

很多时候使用rpy2到只有来回推送数据更为安全。

r.assign('testX', df.A) 
r.assign('testY', df.B) 
%R plot(testX, testY) 

rdf = com.convert_to_r_dataframe(df) 
r.assign('bob', rdf) 
%R plot(bob$$A, bob$$B) 

http://nbviewer.ipython.org/4734581/

+0

感谢您的回答,但是如何解决我在调用''com.convert_to_r_dataframe(mydf)''时遇到的错误?这似乎与情节标签问题 – user248237dfsf

+0

无关,你如何在ipython中定义''%R''? – user248237dfsf

+0

发布示例数据框或笔记本。 –

相关问题