2016-06-02 5 views
0

Wer weiß, wie Str Vektor in Rpy2 in einen numerischen Vektor konvertieren?rpy2: Wie konvertiert man Str Vektor in numerischen Vektor

r('x_num = as.numeric(x)') 

funktioniert, aber X_num ist nicht in der Python-Umgebung. Ich kann es nicht von Python aus nennen.

Ich habe versucht:

x_num = base.as_numeric(x) 
r('class(x_num)') 

, die zeigt:

'<StrVector - Python:0x7fe602a54d88/R:0xa06bb28> 
[str]' 

Der Grund, warum ich dies tun wollen ist, weil, wenn ich pass ein numpy Array robjects.FloatVector, die Klasse der Objekt ist Str Vektor, was Probleme für meine weitere Analyse verursacht. z.B.

x = pd.read_csv('x.csv', index_col=0).values.flatten() 
x_ro = robjects.FloatVector(x) 
r('class(x_ro)') 
'<StrVector - Python:0x7fe605062098/R:0xa16c158> 
[str]' 

Vielen Dank!

bearbeiten: Ich habe bereits x_ro zum env hinzugefügt. Ich habe vergessen, es zu kopieren hier

robjects.globalenv["x_ro"] = x_ro 

Antwort

1

zu Ihrem ersten Problem betrifft, wenn die x_num Variable im Format ist, dass Sie in der R-Umgebung möchten, können Sie seine Ansicht in Python erhalten die numpy.asarray() Methode (wie angegeben in der documentation), so Änderungen an diesem Array in python wirken auch auf die zugrunde liegende R Vektor gemacht könnte:

my_view = numpy.asarray(r("x_num")) 

Es ist auch automatisch, wenn Sie diese Zeile Code eingeben getan werden kann:

from rpy2.robjects import numpy2ri 
numpy2ri.activate() 

So Aufruf r("x_num") sollte ein numpy Array wenn möglich zurückgeben.


auch in Ihrem letzten Code-Snippet, sind Sie sicher, dass dies das „gleiche“ x_ro Objekt ist, wie Sie es in der R environnement nicht setzen? Ich denke, man sollte so etwas tun:

x_ro = robjects.FloatVector(x) 
robjects.globalenv["x_ro"] = x_ro 

dann versuchen Sie es erneut r('class(x_ro)') und sehen, ob Sie den richtigen Ausgang.

+0

danke! für die zweite Frage, ich füge tatsächlich x_ro zum env hinzu, ich habe vergessen, es hier zu kopieren. Die Klasse von x_ro ist str vector still. Für die erste Frage möchte ich einen Weg finden, den str-Vektor in python durch rpy2 in den float-Vektor zu zwingen, anstatt 'r ('')' zu verwenden. aber es funktioniert nicht. – user5025141

+0

Keine Notwendigkeit, ein rpy2-Objekt an ein Symbol im R 'globalenv' zu binden, um seine Klasse in R zu kennen. Tun Sie einfach 'tuple (x_ro.rclass)'. – lgautier

+0

@lgautier good catch (in der Tat habe ich versucht, die Tatsache zu betonen, dass das OP seine Klasse in R getestet hat, von einem rpy2-Objekt, ohne ursprünglich (Frage wurde bearbeitet), binden explizit diese 2 Objekte, die haben könnte B. – mgc

1

Es ist einfacher, ein Problem mit einem vollständig funktionierenden Beispiel zu identifizieren. Ohne es wäre ich versucht zu sagen, dass es wie erwartet funktioniert.

In [1]: import rpy2.robjects as ro 

In [2]: ro.vectors.FloatVector((1,2,3,4,5)) 
Out[2]: 
<FloatVector - Python:0x7f3541c68788/R:0x3541468> 
[1.000000, 2.000000, 3.000000, 4.000000, 5.000000] 

In [3]: ro.vectors.FloatVector(('1','2','3','4','5')) 
Out[3]: 
<FloatVector - Python:0x7f353bff7d88/R:0x3541398> 
[1.000000, 2.000000, 3.000000, 4.000000, 5.000000] 

In [4]: ro.vectors.FloatVector(('1','2','3','a','5')) 
--------------------------------------------------------------------------- 
ValueError        Traceback (most recent call last) 
<ipython-input-4-263bdc61f184> in <module>() 
----> 1 ro.vectors.FloatVector(('1','2','3','a','5')) 

/usr/local/lib/python3.5/dist-packages/rpy2/robjects/vectors.py in __init__(self, obj) 
    454 
    455  def __init__(self, obj): 
--> 456   obj = FloatSexpVector(obj) 
    457   super(FloatVector, self).__init__(obj) 
    458 

ValueError: Error while trying to convert element 3 to a double. 

In [5]: ro.vectors.FloatVector(ro.vectors.StrVector(('1','2','3','a','5'))) 
--------------------------------------------------------------------------- 
ValueError        Traceback (most recent call last) 
<ipython-input-6-26578834d7ec> in <module>() 
----> 1 ro.vectors.FloatVector(ro.vectors.StrVector(('1','2','3','a','5'))) 

/usr/local/lib/python3.5/dist-packages/rpy2/robjects/vectors.py in __init__(self, obj) 
    454 
    455  def __init__(self, obj): 
--> 456   obj = FloatSexpVector(obj) 
    457   super(FloatVector, self).__init__(obj) 
    458 

ValueError: Invalid SEXP type '16' (should be 14). 

Nachdem festgestellt wurde, dass wir R können Vektoren von float von Python bauen, wir, ob eine Bindung es zu einem Symbol in R schauen kann und den Zugriff auf das Objekt aus R einen Unterschied macht. Es tut nicht:

In [1]: import rpy2.robjects as ro 

In [2]: v = ro.vectors.FloatVector((1,2,3,4,5)) 

In [3]: ro.globalenv['v'] = v 

In [4]: ro.r("print(v)") 
[1] 
1 
2 
3 
4 
5 


Out[4]: 
<FloatVector - Python:0x7fb4791e5f08/R:0x2f7eed0> 
[1.000000, 2.000000, 3.000000, 4.000000, 5.000000] 

In [5]: ro.r("class(v)") 
Out[5]: 
<StrVector - Python:0x7fb4791e5548/R:0x2d02658> 
['numeric'] 
+0

zeigt FloatVectors, wie Sie es taten, wenn Sie nur den Vektor ausdrucken, aber wenn ich 'r ('class (FloatVector))' mache, zeigt es str vector. – user5025141

+0

Gleiches (siehe fügte zweiten Teil in der Antwort hinzu.) Ohne ein abgeschlossenes Beispiel, das das Problem demonstriert, wird es schwer sein, mich davon zu überzeugen, dass es einen gibt, nicht zu sagen, dass es keinen gibt, sondern zu sagen, dass ich keinen reproduzieren kann. – lgautier

Verwandte Themen